Questa è una vecchia versione del documento!
Esercitazione 9
Esercizio 1
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 (chiamato pipedec) che prende in ingresso un intero positivo. pipedec lancia 2 processi figli ognuno dei quali esegue con una chiamata exec
il 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).