informatica:sol:laboratorio15:esercitazionia:scexamples

Questa è una vecchia versione del documento!


Alcuni esempi di semplici programmi C con processi e pipe

nproc.c

Si creano nproc processi figli che eseguono un certo numero di iterazioni, si attende quindi la loro terminazione stampando la condizione di terminazione l'exit status e l'eventuale segnale che ha terminato il processo.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>

// utility macro
#define SYSCALL(r,c,e) \
    if((r=c)==-1) { perror(e);exit(errno); }

// numero di processi di default
const int NPROC = 2;

// forward declaration, procedura eseguita da un processo
void procF(int);

int main(int argc, char * argv[]) {
    int nproc;
    
    // check arguments
    if(argc>1)  nproc = atoi(argv[1]);
    else  nproc = NPROC;
    
    // per distinguere tra il processo padre ed i processi figli
    int ppid = getpid();
    
    // genero nproc processi figli
    for(int i=0;i<nproc;i++) {
	int r;
	
	SYSCALL(r,fork(),"creando un processo");
	if(r == 0) {               // processo figlio
	    procF(i+2);            // eseguo i+2 iterazioni
	    break;                 // altrimenti genero troppi processi
	} else {                   // processo padre
	    printf("Creato processo figlio con pid %d\n",r);
	                           // continua il ciclo
	}
    } 
    
    // il solo processo padre attende i figlio
    if(getpid() == ppid) {
	int status,r;
	for(int i=0;i<nproc;i++) {
	    SYSCALL(r, wait(&status), "wait");
	    if(WIFEXITED(status))
		printf("Figlio con pid %d terminato con exit, codice %d\n",
		       r, WEXITSTATUS(status));
	    else if (WIFSIGNALED(status)) {
		printf("Figlio con pid %d terminato da un segnale (sig=%d)\n",
		       r, WTERMSIG(status));
	    } else if (WIFSTOPPED(status) || WIFCONTINUED(status)) 
		printf("Figlio con pid %d interrotto da o ripartito con un segnale\n",r);
	}
    } // else sono un processo figlio e termino senza fare nient'altro
    
    return getpid() % 256; // termino con questo codice
}

// procedura eseguita dai processi figli
void procF(int niter) {
  for(int i=0;i<niter;++i) {
    printf("Sono il processo %d all'iterazione %d\n",getpid(),i);
    sleep(1);
  }
}
informatica/sol/laboratorio15/esercitazionia/scexamples.1430040212.txt.gz · Ultima modifica: 26/04/2015 alle 09:23 (10 anni fa) da Massimo Torquati

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki