:orphan:
.. role:: raw-html(raw)
:format: html
ProdCons
==========
:raw-html:`ProdCons
`
è un programma C il cui obiettivo è mostrare l'utilizzo di semplici servizi per la gestione di file.
.. code-block:: c
:linenos:
#ifndef __PROD_CONS__
#define __PROD_CONS__
#define SHARED_SIZE 4096
#define SHARED_NAME "prod_cons_shm"
#define LONG_SHARED_NAME "/dev/shm/"SHARED_NAME
#define MSG_SIZE 255
#define MSG_SIZE_RAW 256
#define log(...) do{printf("[%d]:", getpid()); printf(__VA_ARGS__);}while(0)
#include
typedef struct __shared_data{
pthread_barrier_t barrier;
pthread_mutex_t mutex;
void *prod_base_addr;
pid_t prod_pid;
pid_t cons_pid;
char message[256];
}shared_data_t;
#endif
.. code-block:: c
:linenos:
#include
#include /* For mode constants */
#include /* For O_* constants */
#include /* For truncate */
#include /* For printf */
#include /* For exit */
#include "prod_cons.h"
int main(int argc, char *argv[]){
shared_data_t *shared_data;
pthread_barrierattr_t pthread_barrierattr;
pthread_mutexattr_t pthread_mutexattr;
int res;
pid_t pid = getpid();
int fd = shm_open(SHARED_NAME, O_CREAT | O_EXCL | O_RDWR, 0666);
if(fd == -1) {
log("The shared memory already exists...Probably there is another producer...exit\n");
goto fail_exit;
}
res = ftruncate(fd, SHARED_SIZE);
if(res == -1) {
log("I cannot allocate enough memory...exit\n");
goto abort;
}
shared_data = mmap(NULL, SHARED_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(shared_data == MAP_FAILED) {
log("I cannot map memory...exit\n");
goto abort;
}
close(fd);
pthread_barrierattr_setpshared(&pthread_barrierattr, PTHREAD_PROCESS_SHARED );
pthread_barrier_init(&shared_data->barrier, &pthread_barrierattr, 2);
pthread_mutexattr_settype(&pthread_mutexattr, PTHREAD_MUTEX_DEFAULT);
pthread_mutexattr_setpshared(&pthread_mutexattr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&shared_data->mutex, &pthread_mutexattr);
log("I'll WAIT for a process at %p\n", shared_data);
shared_data->prod_pid = pid;
shared_data->prod_base_addr = shared_data;
shared_data->message[MSG_SIZE] = '\0';
pthread_mutex_lock(&shared_data->mutex);
pthread_barrier_wait(&shared_data->barrier);
log("Process %d arrived\n", shared_data->cons_pid);
log("I'll produce data...\n");
sprintf(shared_data->message, "Nice to meet you");
log("Done\n");
pthread_mutex_unlock(&shared_data->mutex);
exit(0);
abort:
shm_unlink(SHARED_NAME);
close(fd);
fail_exit:
exit(1);
}
.. code-block:: c
:linenos:
#include
#include /* For mode constants */
#include /* For O_* constants */
#include /* For truncate */
#include /* For printf */
#include /* For exit */
#include "prod_cons.h"
int main(int argc, char *argv[]){
shared_data_t *shared_data;
pid_t pid = getpid();
int fd = shm_open(SHARED_NAME, O_RDWR, 0666);
if(fd == -1) {log("shared mem not initialized\n");exit(1);}
shared_data = mmap(NULL, SHARED_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(shared_data == MAP_FAILED) {
log("I cannot map memory...exit\n");
close(fd);
exit(1);
}
log("shared_data cons address %p\n", shared_data);
log("shared_data prod address %p\n", shared_data->prod_base_addr);
close(fd);
log("I'll JOIN for a process at %p\n", shared_data);
shared_data->cons_pid = pid;
pthread_barrier_wait(&shared_data->barrier);
log("Joined. prod pid %d:\n", shared_data->prod_pid);
pthread_mutex_lock(&shared_data->mutex);
log("I'll consume data...\n");
log("Message: '%s'\n", shared_data->message);
log("Done\n");
pthread_mutex_unlock(&shared_data->mutex);
shm_unlink(SHARED_NAME);
}
Riferimenti
"""""""""""
* :posix:`open `
* :posix:`close `
* :posix:`dup `
* :posix:`exec `