Ciao a tutti qualcuno riuscirebbe a darmi una mano con questi esercizii di sistemi operativi?
la Parte shell già fatta devo fare la parte C... qualcuno può aiutarmi?
Grazie in anticipo
Esercizio
Si realizzi un programma concorrente per UNIX che deve avere una parte in Bourne Shell e una parte in C. La parte in Shell deve prevedere due parametri: il primo deve essere il nome assoluto di un direttorio che identifica una gerarchia (G) all’interno del file system, mentre il secondo parametro deve essere considerato un numero intero strettamente positivo (H). Il programma deve cercare nella gerarchia G specificata tutti i direttori che contengono almeno due file che abbiano un numero di linee uguale ad H: si riporti il nome assoluto di tali direttori sullo standard output. In ogni direttorio trovato, si deve invocare la parte in C, passando come parametri i nomi assoluti dei file trovati (F1, F2, ... FM) e il numero H.
La parte in C accetta un numero variabile di parametri che rappresentano nomi assoluti di file (F1, F2, ... FM) e un numero intero strettamente positivo (H): il numero di file è variabile ma comunque maggiore o uguale a 2; si effettuino i necessari controlli sul numero dei parametri e sull’ultimo parametro considerando, senza verificarlo, che tutti i file abbiano esattamente H linee. Il processo padre deve creare M processi figli (P0 … PM-1): ogni processo figlio è associato ad uno dei file Fi. I processi figli eseguono concorrentemente ed elaborano tutte le H linee del file associato. In particolare, per ogni linea, ciascun processo figlio Pi comunica al padre il primo carattere della linea corrente, e aspetta che il padre gli comunichi se stampare la linea su standard output o meno, e così via per tutte le linee. Il processo padre, per ognuna delle H linee elaborate dai figli, attende che tutti figli gli comunichino un carattere a testa, e comunica di scrivere la linea al figlio che ha mandato il carattere con codice ASCII maggiore, mentre agli altri figli comunica che non devono scrivere. Al termine i processi figli comunicano al padre quante linee hanno scritto sullo standard output e il padre deve stampare su standard output i PID di ogni figlio con il corrispondente valore ritornato.
Esercizio 2
Si realizzi un programma concorrente per UNIX che deve avere una parte in Bourne Shell e una parte in C.
La parte in Shell deve prevedere due parametri: il primo deve essere il nome assoluto di un direttorio che
identifica una gerarchia (G) all’interno del file system e il secondo deve essere considerato un singolo carattere
alfabetico (maiuscolo o minuscolo) (C). Il programma deve cercare nella gerarchia G specificata tutti i direttori
che contengono file che hanno nel loro contenuto istanze del carattere C, sia maiuscolo che minuscolo: ad
esempio se il secondo parametro è il carattere alfabetico ‘A’, si devono cercare tutti i direttori che contengono
file che hanno nel loro contenuto almeno una istanza del carattere ‘A’ e/o del carattere ‘a’. Si riporti il nome
assoluto di tali direttori sullo standard output. In ognuno di tali direttori trovati, si deve invocare la parte in C,
passando come parametri i nomi degli N file trovati (F0, F1, ... FN-1) che soddisfano la condizione precedente e
il carattere C.
La parte in C accetta un numero variabile N+1 di parametri (maggiore o uguale a 3) che rappresentano i primi N
nomi di file (F0, F1, ... FN-1), mentre l’ultimo rappresenta un singolo carattere alfabetico (C) (da controllare).
Il processo padre deve generare N processi figli (P0 … PN-1) ognuno dei quali è associato ad uno dei file Fi.
Ogni processo figlio Pi deve leggere i caratteri del file associato Fi, cercando le occorrenze del carattere
alfabetico C o in maiuscolo o in minuscolo, sempre fino alla fine: a parte il processo P0, la decisione se cercare
la versione maiuscola o minuscola del carattere C viene comunicata dal processo precedente. Infatti i processi
figli devono attenersi inizialmente a questo schema di comunicazione a pipeline: il figlio P0 comunica con il
figlio P1 che comunica con il figlio P2 etc. fino al figlio PN-2 che comunica con il figlio PN-1: in particolare, il
processo P0 cerca la prima occorrenza del carattere C in maiuscolo o in minuscolo e appena trovata, comunica al
processo P1 di cercare il carattere complementare di C, CC; quindi, P1 cerca la prima occorrenza del carattere
CC e appena trovata, comunica al processo P2 di cercare il carattere complementare di CC, CCC; etc.
Terminata questa fase di comunicazione a pipeline, ogni processo cerca tutte le ulteriori occorrenze del carattere
C nella versione cercata in precedenza. Al temine della ricerca, ogni processo figlio deve comunicare al processo
padre una struttura dati che deve contenere 2 campi, cx e occx: cx deve essere il carattere cercato e occx un long
int che rappresenta il numero di occorrenze di cx. Per ogni figlio, il padre ha il compito di stampare su standard
output, rispettando l'ordine dei file, i campi delle strutture ricevute con l’indicazione del file Fi cui si riferiscono.
Al termine, ogni processo figlio Pi deve ritornare al padre il carattere cx e il padre deve stampare su standard
output il PID di ogni figlio e il valore ritornato