Sei sulla pagina 1di 1

Corso di Sistemi Operativi Corso di Fondamenti di Informatica 2 (V.O.

) Compito del 22 Settembre 2004

/* Settembre 2004 */ #include<stdio.h> #include<fcntl.h> #include<string.h> #include<signal.h> #define SIZE 80 int ris=0;

Programmazione di Sistema Unix


Si scriva unapplicazione in C (con le system call del sistema operativo Unix) che presenti linterfaccia: cercaCarFile C1 [C2 ... Cn] Num NomeFile NumSec

void gestore_start (int segnale){ printf("Processo %d, partenza!!! \n", getpid()); } void gestore_stampa (int segnale){ printf("Processo %d, contato %d caratteri\n", getpid(), ris); exit(1); }

dove i parametri C1 [C2 ... Cn] sono singoli caratteri alfabetici, Num e NumSec sono numeri interi e NomeFile un nome di file assoluto. Lapplicazione una gara di velocit tra processi. Per fare questo, il processo iniziale deve generare Num processi, ognuno dei quali avr lo stesso compito e cio quello di contare quanti caratteri di quelli passati come parametro sono presenti nel file NomeFile. Si progetti lapplicazione cercando, per quanto possibile, di rendere la competizione tra i processi giusta, nel senso che i processi dovrebbero avere tutti lo stesso tempo NumSec per eseguire il conteggio. Si consiglia ovviamente di eseguire la ricerca dei caratteri in un file di grosse dimensioni.

main(int argc,char **argv) { int i, fdin, status, nread, Tsec, Nproc, Ncar; char buff[SIZE];

/* ATTENZIONE: inserire parte di controllo argomenti ..... */

signal(SIGUSR1, gestore_start); signal(SIGUSR2, gestore_stampa); Tsec=atoi(argv[argc-1]); Nproc=atoi(argv[argc-3]); Ncar=argc-4;

for(i=0;i<Nproc;i++) { if(fork()==0) { pause(); /* i figli si preparano alla partenza */ fdin=open(argv[argc-2],O_RDONLY); while(read(fdin,buff,1)>0) { for(i=1;i<=Ncar;i++) if(buff[0]==argv[i][0]) ris++; } signal(SIGUSR2, SIG_IGN); /* ho finito stampo risultato finale senza interruzioni */ gestore_stampa(0); exit(0); } }

signal(SIGUSR1, SIG_IGN); signal(SIGUSR2, SIG_IGN);

sleep(1); /* pronti a partire ..... */ kill(0, SIGUSR1); /* VIA ..... */ sleep(Tsec); /* gara in corso */ kill (0, SIGUSR2); /* Fine tempo, causa stampa risultati */

for(i=0; i<Nproc;i++) wait(&status); }