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
/**
* Il padre crea due processi figli: uno legge stringhe e le mette in coda,
* l'altro legge i messaggi dalla coda e li visualizza
*/
#include
#include
#include
#include
#include
#include
#include
#define DIM_MSG 1024
typedef struct {
long mtype;
char mtext[DIM_MSG];
} msg;
// legge le stringhe da tastiera e le mette in coda
void produttore(int coda) {
msg messaggio;
printf("Inserire le stringhe ('quit' per finire): \n");
do {
fgets(messaggio.mtext, DIM_MSG, stdin); // legge una riga (compresso il ritorno a capo)
messaggio.mtype = 1;
if (msgsnd(coda, &messaggio, strlen(messaggio.mtext) + 1, 0) == -1) {
perror("msgsnd");
exit(1);
}
printf("Messaggio inviato: %s\n", messaggio.mtext);
} while (strcmp(messaggio.mtext, "quit\n") != 0);
// NB: l'ultimo messaggio con 'quit' viene mandato anche per segnalare l'EOF
exit(0);
}
// riceve i messaggi dalla coda e li visualizza sullo standard output
void consumatore(int coda) {
msg messaggio;
do {
// legge un messaggio bloccandosi se non ce ne sono
if (msgrcv(coda, &messaggio, DIM_MSG, 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("Messaggio ricevuto: %s\n", messaggio.mtext);
} while (strcmp(messaggio.mtext, "quit\n") != 0);
exit(0);
}
int main() {
int ds_coda;
// crea la coda
if ((ds_coda = msgget(IPC_PRIVATE, IPC_CREAT | 0600)) == -1) {
perror("msgget");
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(ds_coda);
}
} else {
consumatore(ds_coda);
}
msgctl(ds_coda, IPC_RMID, NULL);
}