====== 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 #include #include #include #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).