Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio19:esercitazionib:esercitazione10

Esercitazione 10

Esercizio 1

Scrivere un programma C in cui si attivano M thread produttori ed N thread consumatori che condividono una coda (di lunghezza “infinita”). Il programma accetta come argomento anche un intero K che corrisponde al numero totale di messaggi che i produttori producono concorrentemente nella coda (ogni produttore produce K/M messaggi se M divide K). I consumatori leggono i messaggi dalla coda in un ciclo infinito fino a quando non ricevono un messaggio speciale che li fa terminare. Implementare la coda concorrente, ed il protocollo di terminazione senza usare la cancellazione esplicita dei threads. Testare il programma al variare di M ed N.

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

informatica/sol/laboratorio19/esercitazionib/esercitazione10.txt · Ultima modifica: 06/05/2019 alle 13:37 (5 anni fa) da Massimo Torquati