Esercitazione 8
System calls (SC) che operano su processi e pipe senza nome.
Esercizio 1
Realizzare un programma C che prende come argomento un comando e la lista dei parametri da passare al comando. Il programma esegue il comando lanciando un processo figlio. Il i due processi comunicano tramite una pipe. L'output del programma dovrà essere tipo:
./prettycomand ls -al **************************************** Comando eseguito: ./prettycommand ls -al **************************************** Risultato: drwxrwxr-x 14 torquati torquati 4096 apr 19 16:37 . drwxrwxr-x 9 torquati torquati 4096 apr 8 08:49 .. drwxrwxr-x 2 torquati torquati 4096 mar 27 2015 dir1 drwxrwxr-x 2 torquati torquati 4096 mag 29 2015 dir2 -------------------------------------------[0]
dove tra []
viene riportato l'exit status del processo figlio.
Esercizio 2
Scrivere un programma chiamato pszombies
che stampa il pid dei processi zombies presenti nel sistema
utilizzando una pipeline di 3 processi.
Il primo processo esegue il comando ps -A -ostat,pid
e fornisce l'input al secondo processo che esegue
il comando grep -e [zZ]
e che a sua volta fornisce l'input al terzo processo che esegue il comando
awk {print $2}
. L'aoutput deve essere equivalente al comando shell:
bash $> ps -A -ostat,pid | grep -e [zZ] | awk '{print $2}'
Esercizio 3
Considerare il seguento programma dec.c
:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #define SYSCALL(r,c,e) if((r=c)==-1) { perror(e);exit(errno); } int main(int argc, char *argv[]) { int x,r; if (argc>1) { x = atoi(argv[1]); if (x<0) goto fine; SYSCALL(r, write(1, &x,sizeof(x)),"write1"); } do { SYSCALL(r,read(0, &x,sizeof(x)),"read"); if (r==0) { fprintf(stderr, "Processo %d, esco perche' lo standard input e' chiuso!\n", getpid()); return 0; } fprintf(stderr, "Processo %d, ricevuto %d\n", getpid(),x); --x; if (x<0) break; SYSCALL(r, write(1, &x,sizeof(x)), "write2"); } while(1); fine: fprintf(stderr, "Processo %d, esco perche' raggiunto valore negativo\n", getpid()); return 0; }
Scrivere un programma (pipedec
) che prende in ingresso un intero positivo, quindi lancia 2 processi figli ognuno dei quali esegue l'eseguibile del programma dec
. Solo ad uno dei due processi figli viene passato come argomento l'intero positivo passato al programma pipedec
. I due processi figli devono essere connessi tra di loro in modo tale che lo standard input di un processo sia connesso con lo standard output dell'altro processo (la connessione e' quindi bidirezionale).