Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio16:esercitazionia:esercitazione8

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

informatica/sol/laboratorio16/esercitazionia/esercitazione8.txt · Ultima modifica: 19/04/2016 alle 14:36 (7 anni fa) da Massimo Torquati