Warning: Undefined array key "view" in /var/www/html/wp-content/uploads/classes/so/1617/lab-homeworks/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/1617/lab-homeworks/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-homeworks/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/1617/lab-homeworks/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-homeworks/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/1617/lab-homeworks/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-homeworks/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/1617/lab-homeworks/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-homeworks/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/1617/lab-homeworks/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-homeworks/index.php on line 51
/* Homework n.6 Scrivere un programma che crei un processo figlio con cui scambiera' dati tramite una coda di messaggi. Tale coda sara' creata dal padre e distrutta, a fine lavori, dal figlio. Il processo padre dovra' accettare comandi inseriti da tastiera (per semplicita' senza parametri) e questi dovranno essere inviati al figlio che li eseguira' di volta in volta creando dei processi nipoti: uno per ogni comando. Il tutto si dovra' arrestare correttamente all'inserimento del comando 'exit' sul padre. */ #include #include #include #include #include #include #include #define DIM_MSG 1024 typedef struct { long mtype; char mtext[DIM_MSG]; } msg; /* si occupa di leggere i comandi dal prompt e di inviarli sulla coda dei messaggi */ void gestore_terminale(int coda) { msg comando; int len; do { printf("> "); fgets(comando.mtext, DIM_MSG, stdin); len = strlen(comando.mtext); if (comando.mtext[len-1] == '\n') comando.mtext[len-1] = '\0'; comando.mtype = 1; if ( msgsnd(coda, &comando, strlen(comando.mtext)+1, IPC_NOWAIT) == -1 ) { perror("msgsnd"); exit(1); } sleep(1); } while ( strcmp(comando.mtext, "exit") != 0 ); exit(0); } /* si occupa di ricevere i comandi dalla coda e di eseguirli tramite dei processi figli */ void esecutore(int coda) { msg comando; while (1) { if ( msgrcv(coda, &comando, DIM_MSG, 0, 0) == -1 ) { perror("msgrcv"); exit(1); } if ( strcmp(comando.mtext, "exit") == 0 ) break; if ( fork() == 0 ) { execlp(comando.mtext, comando.mtext, NULL); fprintf(stderr, "Errore nell'esecuzione di '%s'\n", comando.mtext); exit(2); } else wait(NULL); } msgctl(coda, IPC_RMID, NULL); exit(0); } int main() { int ds_coda; key_t chiave = IPC_PRIVATE; if ( (ds_coda = msgget(chiave, IPC_CREAT|IPC_EXCL|0600)) == -1 ) { perror("msgget"); exit(1); } if ( fork() != 0 ) gestore_terminale(ds_coda); else esecutore(ds_coda); }