Il seguente programma legge una riga di testo dallo standard input per poi scriverla su un file. Un secondo processo, avviato dallo stesso programma, attende il completamento dell'operazione di scrittura sul file (segnalata attraverso l'invio di un apposito segnale) per poter leggere la riga di testo inserita. La realizzazione presentata soffre di un grave problema legato alla sincronizzazione tra i due processi attraverso l'uso dei segnali. Allo studente è chiesto di illustrare l'errore e riscrivere il programma in modo corretto.
/* Il gestore del segnale SIGUSR1 */
void sig_handler() {
printf("padre: ricevuto segnale di lettura conclusa.\n");
}
int main(int argc, char *argv[]) {
int pid, ppid;
char buffer[1000];
FILE *file;
signal(SIGUSR1, sig_handler);
if((pid=fork()) < 0) {
perror("fork error");
exit(1);
} else if(pid == 0) {
/* Processo figlio */
ppid = getppid();
printf("figlio: mio padre e' %d\n", ppid);
printf("figlio: inserire la frase da scrivere su file -> ");
fgets(buffer, 1000, stdin);
printf("figlio: hai inserito '%s'.",buffer);
printf("figlio: apro il file.\n");
file = fopen(argv[1], "w");
printf("figlio: scrivo sul file.\n");
fputs(buffer, file);
fclose(file);
printf("figlio: invio SIGUSR1 al padre.\n");
kill(ppid, SIGUSR1);
exit(0);
} else {
/* Processo padre */
printf("padre: mio figlio e' %d\n", pid);
printf("padre: attendo segnale dal figlio.\n");
pause();
printf("padre: apro il file.\n");
file = fopen(argv[1], "r");
printf("padre: leggo dal file.\n");
fgets(buffer, 1000, file);
printf("padre: la stinga inserita e' '%s'.\n", buffer);
fclose(file);
exit(0);
}
}