====== 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 2 ===== 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 (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). ===== Esercizio 3 ===== Realizzare in C un programma client ed un programma server. I due processi intergiscono utilizzando socket AF_UNIX. Il client apre una connessione verso il server ed invia richieste (sotto forma di stringhe) corrispondenti ad operazioni aritmetiche inserite dall'utente (es. 2+1, 3/4 + 2/7, sqrt(5) + 3.14, ...). Il server gestisce una connessione alla volta. Il client invia una stringa di comandi alla volta ed attende il risultato. Per eseguire l'operazione, il server lancia un processo che esegue la calcolatrice testuale 'bc'. Il messaggio di risposta del server รจ una stringa contenente il risultato calcolato. La sequenza di operazioni termina quando il client riceve in input la stringa "quit" dall'utente. Il server si rimette in attesa di ricevere una nuova connessione da un client.