SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A ) 31 MARZO 2006

Documenti analoghi
SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A ) 30 MARZO 2007

SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A ) - 19 MARZO 2003

Comunicazione tra processi: pipe Le pipe sono un meccanismo UNIX di Inter Process Communication (IPC)

Sistemi Operativi T. Esercizi

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Seconda Esercitazione. Gestione di processi in Unix Primitive Fork, Wait, Exec

Sistemi Operativi Teledidattico

Esercitazione 4. Gestione dei file in Unix

System call per la gestione di processi

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo

System call per la gestione di processi

Addendum alle chiamate di sistema per la gestione processi. E Mumolo

La funzione main() (

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

La Comunicazione tra Processi in Unix

La Comunicazione tra Processi in Unix

Settima esercitazione. Shell scripting

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Fondamenti di Informatica L-A

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

" &$ () " ) ) $ ' () *) " ) $

La creazione di un nuovo processo in UNIX

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Sistemi Operativi 1. Mattia Monga. a.a. 2015/16. Dip. di Informatica Università degli Studi di Milano, Italia

Sistemi Operativi. Bruschi Monga Re. Shell Esercizi Shell programming Esercizi I/O. Sistemi Operativi. Bruschi Monga Re

SmallShell Piccolo processore comandi

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Esercizio sulla gestione di processi in Unix!

System Call EXEC EXEC P P. fork exec(new_prog) fork. sono_il_padre = fork(); if (!sono_il_padre) {

Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ;

Esercizio sulla gestione di file in Unix. Sistemi Operativi T AA

Politecnico di Torino

Pag. 1. modello di esecuzione parallela

Il compito del 11 novembre 2004

IEIM Esercitazione II Elementi di programmazione C. Alessandro A. Nacci -

Unix - Shell dei comandi Sostituzioni

Esercizio 1 system call

eseguire comandi dati dall'utente, utilizzando una macchina reale, di livello inferiore,

La funzione main() La funzione main(), presente in tutti i programmi C, è una funzione come tutte le altre

Esempio 1. Creare uno script (file comandi) che abbia la sintassi:

Sistemi Operativi (M. Cesati)

Informatica B

Informatica B

I cicli. Iterazioni Calcolo della media Istruzioni break e continue

Sistemi Operativi 1. Mattia Monga. a.a. 2018/19. Dip. di Informatica Università degli Studi di Milano, Italia

I Processi nel Sistema Operativo Unix. Gerarchie di processi Unix. Stati di un processo Unix. Stati di un processo Unix.

Chiamate di sistema. Pipe Flussi di I/O

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Filtri e pipeline. qualsiasi comando unix ha a disposizione 3 file con cui comunicare con il resto del sistema: standard input in ingresso

Chiamate di sistema. Pipe Flus s i di I/O

Controllo dei Processi 1

Informatica A (per gestionali) A.A. 2004/2005. Esercizi di programmazione C Stringhe Ricerca binaria

Lezione 11: Liste a Puntatori e Input/Output

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

1. Esercizio tipo per prova pratica

SISTEMI OPERATIVI L-A Prova scritta parziale finale del 18 Marzo 2003

I Processi nel SO UNIX

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill

La sincronizzazione è legata alla implementazione delle pipe: int pipe(int fd[2]);

accesso * leggiaccessi(char * nomefile, int * dim);

Esercizi proposti. Esercizio Somma numeri Esercizio Bersagli Esercizio Consumi toner

TUTORAGGIO INFORMATICA Settimana 5

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

Esercizio 1 system call

2. Teoria. [7 punti] La comunicazione tra processi nel sistema UNIX.

Esercitazione 11. Liste semplici

Università degli Studi di Verona. Esercizi. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill!

if(vocale == true && stringa[i+1] == stringa[i]){ cont++; printf("la vocale ripetuta e' %c\nil numero di coppie e' %d\n", stringa[i], cont); }

Esercizio 1 system call

Programmazione I PROVA SCRITTA. Classe 1 (Matricole congrue a 0 modulo 3) Proff. De Prisco - Visconti. Sessione Febbraio 3 Febbraio 2016

Politecnico di Milano - Dipartimento di Elettronica, informazione e Bioingegneria Prof. Mauro Negri

In generale può essere utile che i due processi eseguano del codice diverso

Sistemi Operativi (M. Cesati)

Aritmetica dei puntatori

Programmi in Assembly

IEIM Esercitazione 1 Primi passi con la programmazione" Alessandro A. Nacci -

I Processi nel SO UNIX

LINUX: struttura generale

Riepilogo sulla Concorrenza

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

ELEMENTI DI INFORMATICA. Linguaggio C

GESTIONE DELLA COMUNICAZIONE LOCALE TRA PROCESSI IN UNIX:

ESERCITAZIONE 2 fork e exec

I/O Avanzato in C: scheda riassuntiva

Introduzione alla programmazione nella shell di Unix 10 Maggio 2005

Laboratorio. Due. 1) Switch 2) Costrutti Iterazione (For, While, do while)

C: panoramica. Violetta Lonati

Laboratorio di Sistemi Operativi primavera 2009

2 Operatori matematici e costrutto if

TUTORAGGIO INFORMATICA Settimana 1

Politecnico di Milano - Dipartimento di Elettronica e informazione Prof. Mauro Negri

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

Informatica B

Transcript:

SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A. 05-06) 31 MARZO 2006 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 identica una gerarchia (G) all interno del le system, mentre il secondo parametro deve essere considerato una stringa S di tre caratteri. Il programma deve cercare nella gerarchia G specicata tutti i direttori che contengono almeno un le il cui nome abbia come terminazione.s e la cui lunghezza sia multiplo intero di 51. Si riporti il nome assoluto di tali direttori sullo standard output. In ogni direttorio trovato e per ogni le trovato Fi che soddisfa la condizione precedente, si deve invocare la parte in C, passando come parametro il nome del le Fi. La parte in C accetta un parametro che rappresenta il nome di un le Fi binario che si supponga costituito da soli numeri interi positivi. Il processo padre per prima cosa deve inizializzare un array A di quattro elementi interi con i numeri 2, 3, 5 e 7 e quindi deve generare 4 processi gli (P0 P3): ogni processo glio è associato ad uno degli elementi dell array A. Ognuno di tali processi gli esegue concorrentemente aspettando il numero comunicato o dal padre (nel caso del primo glio) o dal fratello precedente e quindi prova a dividere tale numero per il numero ad esso associato: solo se il numero non è divisibile, il processo glio lo comunica al processo glio successivo, a parte l'ultimo glio che deve riportare il numero sullo standard output. Il processo padre deve concorrentemente leggere i numeri interi dal le Fi (si supponga tali numeri sempre strettamente minori di 51) e li comunica al primo glio. Ogni processo glio deve ritornare al padre il numero di numeri divisibili e quindi scartati. Il padre, dopo che i gli sono terminati, deve stampare su standard output i PID di ogni glio con il corrispondente valore ritornato.

#!/bin/sh # Soluzione del compito di Sistemi Operativi e Laboratorio del 31 # marzo 2006 # # ============= le del controllo parametri ============== # PARAMETRI: # $1) dirass $2) S # controllo numero dei parametri case $# in 2);; *) echo "Errore nel numero dei parametri" exit 1;; #controllo primo parametro = direttorio assoluto case $1 in /*) if test! -d $1 -o! -x $1 echo "Direttorio non esistente o non accessibile" exit 2; ;; *) echo "Direttorio non assoluto" exit 3;; # controllo secondo parametro = numero intero strettamente positivo # minore di 50 case $2 in???);; *) echo "Errore: $2 non e' una stringa di tre caratteri" exit 3;; # Salvo il numero nella variabile che poi esportero' S=$2 #Impostazione della variabile PATH PATH=$PATH:`pwd` export PATH export S #chiamata alla parte ricorsiva partericorsiva.sh $1 #!/bin/sh

# Soluzione del 31 marzo 2006 # # ============= PARTE RICORSIVA ====================== # $1) dirass # # variabili di subshell LISTA_FILE= # contiene la lista di tutti i le del direttorio in # esame che soddisfano la condizione del testo # entro nella sottogerarchia cd $1 for i in * do if test -f $i -a -r $i done # test delle condizioni del le dim=`wc -c <$i` resto=`expr $dim % 51` if test $resto -eq 0 case $i in *.$S) echo "Il le $i soddisfa le condizioni" LISTA_FILE="$LISTA_FILE $i";; *) echo "Il le $i NON soddisfa le condizioni";; # Ho trovato almeno un nome di le del direttorio corrente? if test! -z "$LISTA_FILE" echo "Trovato il direttorio $1" echo "Invoco la parte c per ciascuno dei le trovati" for i in "$LISTA_FILE" do partec $i done # ricerca ricorsiva nei sottodirettori for i in * do if test -d $i -a -x $i $0 `pwd`/$i

done

#include <stdio.h> #include <string.h> #include <signal.h> #include <fcntl.h> #include <sys/stat.h> #dene PERM 0644 /* in UNIX */ typedef int pipe_t[2]; int main(int argc, char* argv[]) /* ======== VARIABILI LOCALI ================ */ int A[4]=2,3,5,7;// numeri dell'array A int i,j; // indici cicli for int pid; // pid per processi pipe_t piped[4]; // pipe descriptors int numero; // numero letto dalla pipe int cont; // contatore dei le divisibili per il proprio numero // e quindi scartati int status; // variabile di stato per la wait int fdr; // le descriptor per il padre /* ========================================== */ /* Controllo numero dei parametri */ if(argc<2) printf("errore nel numero degli argomenti: %s nomele\n", argv[0]); exit(-1); /* Creazione delle 4 pipes*/ for(i=0; i<4; i++) if(pipe(piped[i])<0) printf("errore di creazione della pipe\n"); exit(-2); /* Generazione dei 4 processi gli */ for(i=0; i<4; i++) if((pid=fork())<0) printf("errore nella fork\n"); exit(-3); if(pid==0) /* CODICE DEL FIGLIO */ /* Prima chiudo le pipe che non uso */ for (j=0; j<4; j++) if(j!=i+1) close(piped[j][1]); if(j!=i) close(piped[j][0]); cont=0; printf("sono il glio %d e comincio a leggere\n", i);

/* aspetto il numero comunicato dal precedente */ while (read(piped[i][0], &numero, sizeof(int)), numero!= -1) printf("sono il glio %d e ho letto %d\n", i, numero); if( (numero % A[i])!= 0) /* il numero letto non è divisibile per il mio numero */ if(i==3) /* Sono l'ultimo glio */ printf("%d\n", numero); else write(piped[i+1][1], &numero, sizeof(int)); else cont++; if(i<3) /* passo il -1 a fratello seguente, tranne per l'ultimo*/ write(piped[i+1][1], &numero, sizeof(int)); printf("sono il glio %d e muoio con cont=%d\n", i, cont); /* suppongo cont <= 255*/ exit(cont); /* ne codice del glio*/ /* FINE FOR */ /* CODICE DEL PADRE*/ /* Chiusura di tutte le pipe tranne la prima in scrittura */ for(i=0; i<3; i++) close(piped[i][0]); if(i!=0) close(piped[i][1]); /* apro il le passato come primo argomento */ if((fdr=open(argv[1], O_RDONLY))<0) printf("errore nella apertura del le %s\n", argv[1]); exit(-4); while(read(fdr, &numero, sizeof(int))>0) printf("sono il padre ed ho letto il numero \"%d\"\n", numero); /* scrivo il numero letto nella pipe del primo glio */ write(piped[0][1], &numero, sizeof(int)); /* ne while di lettura dal le fdr*/ /* invio il segnale al primo glio di terminare la catena*/ numero=-1; write(piped[0][1], &numero, sizeof(int) );

/* Aspetto i vari gli */ while((pid=wait(&status))>0) printf("il glio con PID %d è morto con codice di ritorno %d\n", pid, (status >> 8)&0xFF );