UNIX: testo della esercitazione 5 in laboratorio su primitive per la ...
UNIX: testo della esercitazione 5 in laboratorio su primitive per la ...
UNIX: testo della esercitazione 5 in laboratorio su primitive per la ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
}<br />
}<br />
for (;;)<br />
{<br />
pause();<br />
sleep(1);<br />
kill(pid, SIGUSR1);<br />
}<br />
Esercizio 4:<br />
Esempio di un p<strong>in</strong>g-pong di messaggi tra un processo padre e un processo figlio (versione con<br />
segnali affidabili).<br />
#<strong>in</strong>clude <br />
#<strong>in</strong>clude <br />
<strong>in</strong>t ntimes = 0; /* variabile globale */<br />
void catcher(<strong>in</strong>t signo)<br />
{<br />
pr<strong>in</strong>tf("Processo %d ricevuto #%d volte\n", getpid(), ++ntimes);<br />
}<br />
<strong>in</strong>t ma<strong>in</strong>()<br />
{<br />
<strong>in</strong>t pid, ppid;<br />
sigset_t set, oldset, zeromask;<br />
struct sigaction action, old_action;<br />
sigemptyset(&zeromask);<br />
/* azzera tutti i f<strong>la</strong>g <strong>del<strong>la</strong></strong> maschera sa_mask nel<strong>la</strong> struttura action */<br />
sigemptyset(&action.sa_mask);<br />
action.sa_handler = catcher;<br />
action.sa_f<strong>la</strong>gs = 0;<br />
sigemptyset(&set);<br />
sigaddset(&set, SIGUSR1);<br />
sigprocmask(SIG_BLOCK, &set, &oldset);<br />
/* assegna action <strong>per</strong> <strong>la</strong> gestione di SIGUSR1 */<br />
if (sigaction(SIGUSR1, &action, &old_action) == -1)<br />
<strong>per</strong>ror("sigaction error");<br />
if ((pid=fork()) < 0)<br />
{<br />
<strong>per</strong>ror("fork error");<br />
exit(1);<br />
}<br />
else<br />
if (pid == 0)