Sei sulla pagina 1di 4

ESERCIZI RELATIVI ALLA PARTE DI UNIX (6 punti)

ESERCIZIO 1 (1 punti)
Data listruzione int a = 8, b = 15; indicare il risultato delle istruzioni seguenti:
(1 punti)
printf("%d\n", ( (a >> 2) | 8) >> 2 ); ___________
printf("%d\n", ( (a | b) ^ b ) );
___________
ESERCIZIO 2 (4 punti)
(2.1) Illustrare il funzionamento della system call
int execve(const char *pathname, char *const argv[], char *const envp[]);
(2 punti)
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
(2.2) Illustrare sinteticamente il funzionamento della system call pipe a partire dal prototipo
int pipe( int fd[2] );
(2 punto)
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________

___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
ESERCIZIO 3 (1 punti)
(1 punti)
Spiegare succintamente listruzione seguente, in particolare in riferimento ai parametri della chiamata:
if((msgrcv(m_id, &q, sizeof(q), getpid(),0)) == -1)
errExit("msgrcv error");
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________

SOLUZIONI 26/9/2012

ESERCIZI RELATIVI ALLA PARTE DI UNIX (6 punti)


ESERCIZIO 1 (1 punti)
Data listruzione int a = 8, b = 15; indicare il risultato delle istruzioni seguenti:
(1 punti)
printf("%d\n", ( (a >> 2) | 8) >> 2 ); ___________
printf("%d\n", ( (a | b) ^ b ) );
___________
Soluzione [02_integrazione_linguaggio.pdf, pagine 4 e sgg.]
printf("%d\n", ( (a >> 2) | 8) >> 2 ); _____2_____
printf("%d\n", ( (a | b) ^ b ) );
_____0_____
ESERCIZIO 2 (4 punti)
(2.1) Illustrare il funzionamento della system call
int execve(const char *pathname, char *const argv[], char *const envp[]);
(2 punti)
Soluzione [04_exec_processi.pdf, pagine 2 e sgg.]
La system call execve() carica un nuovo programma nella memoria di un processo. Con questa
operazione, il vecchio programma abbandonato, e lo stack, i dati, e lo heap del processo sono
sostituiti da quelli del nuovo programma. Dopo avere eseguito l'inizializzazione del codice, il nuovo
programma inizia l'esecuzione dalla propria funzione main(). Non restituisce in caso di successo;
restituisce -1 in caso di fallimento.
Esistono varie funzioni di libreria, tutte con nomi che iniziano con exec-, basate sulla system call
execve(): ciascuna di queste funzioni fornisce una diversa interfaccia alla stessa funzionalit.
L'argomento pathname contiene il pathname del programma che sar caricato nella memoria del
processo. L'argomento argv specifica gli argomenti della linea di comando da passare al nuovo
programma. Si tratta di una lista di puntatori a stringa, terminati da puntatore a NULL. Il valore fornito
per argv[0] corrisponde al nome del comando. Tipicamente, questo valore lo stesso del basename
(i.e., l'ultimo elemento) del pathname. L'ultimo argomento, envp, specifica la environment list per il
nuovo programma. L'argomento envp corrisponde all'array environment; una lista di puntatori a
stringhe (terminata da ptr a NULL) nella forma name=value.
(2.2) Illustrare sinteticamente il funzionamento della system call pipe a partire dal prototipo
int pipe( int fd[2] );
(2 punti)
Soluzione [05_pipes_FIFOs.pdf, pagine 4 e sgg.]
La system call crea un pipe che permette la comunicazione fra due processi (uno antenato dellaltro),

che eseguono due diversi comandi. Un pipe uno strumento di comunicazione fra due processi: uno
scrive uno stream di byte su un descrittore di file, e laltro legge lo stream di byte da un descrittore di
file. I dati passano in maniera unidirezionale attraverso il pipe in sequenza: i byte sono letti nello stesso
ordine in cui sono stati scritti.
In un caso di utilizzo tipico, durante una fork() il processo figlio eredita copia dei descrittori di file del
genitore. Subito dopo la fork() uno dei due processi chiude il proprio lato del pipe in lettura e laltro
chiude il proprio in lettura, realizzando cos lunidirezionalit della comunicazione. Come con gli altri
descrittori di file, possibile utilizzare le system call read() e write() per effettuare operazioni di I/O
sul pipe.
ESERCIZIO 3 (1 punti)
(1 punto)
Illustrare succintamente listruzione seguente, in particolare in riferimento ai parametri attuali della
chiamata:
if((msgrcv(m_id, &q, sizeof(q), getpid(),0)) == -1)
errExit("msgrcv error");
Soluzione [07_code_messaggi.pdf, pagine 15 e sgg.]
La system call msgrcv utilizzata per prelevare un messaggio dalla coda identificata dallintero m_id;
il messaggio copiato nel buffer riferito da q, la cui dimensione massima costituita da sizeof(q) byte.
Il penultimo parametro, che costituisce il msgtype permette di stabilire un criterio per prelevare i
messaggi: se il msgtype impostato a 0, prelevato il primo messaggio; se il msgtype maggiore di 0
prelevato il primo messaggio il cui mtype eguale al msgtype (nellesempio attuale, il processo
chiamante seleziona un messaggio con msgtype pari al pid del processo stesso); infine, se il msgtype
minore di 0, la coda funziona come una coda con priorit: in questo caso prelevato il primo
messaggio con il pi basso mtype minore o uguale al valore assoluto di msgtype. Lultimo argomento
una maschera di bit che pu assumere alcuni valori predefiniti, come per esempio IPC_NOWAIT o
MSG_NOERROR.