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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>in</strong>t sigprocmask(<strong>in</strong>t how, const sigset_t *set, sigset_t *oldset);<br />

Un processo può esem<strong>in</strong>are e/o modificare <strong>la</strong> propria signal mask (<strong>in</strong>sieme dei segnali che sta<br />

bloccando) attraverso <strong>la</strong> funzione sigprocmask().<br />

<strong>in</strong>t<br />

sig<strong>su</strong>spend(const sigset_t *mask);<br />

La funzione sig<strong>su</strong>spend() <strong>per</strong>mette l’attivazione <strong>del<strong>la</strong></strong> maschera specificata e l’attesa <strong>in</strong> modo<br />

atomico.<br />

#<strong>in</strong>clude <br />

<strong>in</strong>t nanosleep(const struct timespec *req, struct timespec *rem);<br />

La funzione nanosleep() ritarda l’esecuzione del processo di un tempo specificato all’<strong>in</strong>terno<br />

<strong>del<strong>la</strong></strong> struttura ∗req.<br />

2 Pipe<br />

<strong>in</strong>t pipe (<strong>in</strong>t file_descriptors[2])<br />

Una possibile tecnica <strong>per</strong> <strong>la</strong> comunicazione tra processi è l’utilizzo <strong>del<strong>la</strong></strong> chiamata di sistema<br />

pipe(), che crea un canale di comunicazione. Il parametro file descriptors[2] è un array che<br />

pipe() riempie con un file descriptor a<strong>per</strong>to <strong>in</strong> lettura, file descriptor[0], e un file descriptor<br />

a<strong>per</strong>to <strong>in</strong> scrittura, file descriptor[1].<br />

Il buffer associato ad ogni pipe ha una dimensione f<strong>in</strong>ita (PIPE BUF). Se un processo cerca<br />

di scrivere (write() system call) <strong>su</strong> una pipe il cui buffer è pieno il processo viene bloccato<br />

dal sistema o<strong>per</strong>ativo f<strong>in</strong>chè il buffer non viene liberato attraverso una o<strong>per</strong>azione di lettura<br />

(read() system call). Se il buffer è vuoto e un processo cerca di leggere da una pipe, il processo<br />

viene bloccato f<strong>in</strong>chè non avviene una o<strong>per</strong>azione di scrittura. Un processo padre può<br />

comunicare con un processo figlio attraverso una pipe <strong>in</strong> quanto il processo figlio possiede<br />

una copia dei file descriptor del padre.<br />

Per convenzione le pipe vengono utilizzate come canali di comunicazione unidirezionali. Se<br />

due processi richiedono un canale di comunicazione bidirezionale tipicamente si creano due<br />

pipe.<br />

Tutti i file con il codice sorgente degli esercizi proposti (es∗.c) si trovano nel direttorio:<br />

/home/soa/eserc5/<br />

3 Esercizi <strong>su</strong>i segnali<br />

Esercizio 1:<br />

In questo esempio il processo corrente def<strong>in</strong>isce un handler <strong>per</strong> il segnale SIGINT. Provate a<br />

term<strong>in</strong>are il programma con il comando Ctrl ∧ c. Per term<strong>in</strong>are effettivamente il programma<br />

sospendere l’esecuzione con il comando Ctrl ∧ z e dal<strong>la</strong> shell <strong>in</strong>vocare il comando kill -9 . Per vi<strong>su</strong>alizzare l’elenco dei vostri processi utilizzare il comando ps<br />

-elf | grep .

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

Saved successfully!

Ooh no, something went wrong!