11.07.2014 Views

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 ...

SHOW MORE
SHOW LESS

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)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!