Warning:  Undefined array key "view" in /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php on line 2
Warning:  Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php on line 47
Warning:  Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php on line 48
Warning:  Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php on line 49
Warning:  Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php on line 50
Warning:  Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1920/lab-examples/index.php on line 51
/**
 *  Crea due processi figli: uno legge da tastiera stringhe e
 *  le manda al secondo.
 *  I due processi usano memoria condivisa e semafori per comunicare.
 */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define DIM_MSG 1024
// legge le stringhe da tastiera e le scrive sulla memoria condivisa
void produttore(int shm, int sem) {
    char *p;
    struct sembuf SIGNAL[1] = { { 0, +1, 0 } };
    // attacca la memoria condivisia al suo spazio di indirizzamento
    if ((p = (char *)shmat(shm, NULL, 0)) == (char *)-1) {
        perror("shmat");
        exit(1);
    }
    printf("Inserire le stringhe da copiare sulla memoria condivisa ('quit' per finire): \n");
    do {
        fgets(p, DIM_MSG, stdin); // legge una riga e la scrive direttamente sulla shm
        printf("Messaggio scritto: %s", p);
        semop(sem, SIGNAL, 1);  // invoca SIGNAL sul semaforo
    } while (strcmp(p, "quit\n") != 0);
    // NB: viene inviato anche l'ultimo messaggio con "quit"
    exit(0);
}
// legge i messaggi dalla memoria condivisa e li visualizza sullo standard output
void consumatore(int shm, int sem) {
    char *p;
    struct sembuf WAIT[1] = { { 0, -1, 0 } };
    // attacca (in sola lettura) la memoria condivisia al suo spazio di indirizzamento
    if ((p = (char *)shmat(shm, NULL, SHM_RDONLY)) == (char *)-1) {
        perror("shmat");
        exit(1);
    }
    do {
        semop(sem, WAIT, 1);                // invoca WAIT sul semaforo mettendosi in attesa
        printf("Messaggio letto: %s", p);   // legge e stampa il messaggio
    } while (strcmp(p, "quit\n") != 0);
    exit(0);
}
int main() {
    int id_shm, id_sem;
    // crea l'area di memoria condivisa
    if ((id_shm = shmget(IPC_PRIVATE, DIM_MSG, IPC_CREAT | 0600)) == -1) {
        perror("shmget");
        exit(1);
    }
    // crea il semaforo per segnalare da disponibilita' di messaggi
    if ((id_sem = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600)) == -1) {
        perror("semget");
        exit(1);
    }
    // imposta il valore iniziale del semaforo ad 0
    if (semctl(id_sem, 0, SETVAL, 0) == -1) {
        perror("semctl");
        exit(1);
    }
    // crea i due processi figli: produttore e consumatore
    if (fork() != 0) {
        if (fork() != 0) {
            // corpo del padre
            wait(NULL);
            wait(NULL);
        } else {
            produttore(id_shm, id_sem);
        }
    } else {
        consumatore(id_shm, id_sem);
    }
    // distrugge memoria condivisa e semaforo
    shmctl(id_shm, IPC_RMID, NULL);
    semctl(id_sem, 0, IPC_RMID, 0);
    exit(0);
}