Indice

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 <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).

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.