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



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

Esercitazione di Lab. di Sistemi Operativi a.a. 2012/ I processi Unix -

La creazione di un nuovo processo in UNIX

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

Corso di Sistemi Operativi A.A CHIAMATE DI SISTEMA PER IL CONTROLLO DEI PROCESSI. Fabio Buttussi

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

Programmazione multiprocesso

File I/O. M. R. Guarracino: File I/O 1

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

Esercitazione di Lab. di Sistemi Operativi 1 a.a. 2011/2012

Esercitazione di Lab. di Sistemi Operativi. - I/0 di basso livello

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

Processi UNIX. I Processi nel SO UNIX. Gerarchie di processi UNIX. Modello di processo in UNIX

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

Chiamate di sistema per la Inter Process Communication (IPC) in POSIX. E.Mumolo, DEEI

Laboratorio di Sistemi Operativi

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3. 1 strace : visualizzazione delle system call invocate da un processo

Esercizio sulla gestione di file in Unix

Corso di Laboratorio di Sistemi Operativi

Gestione dei processi

CREAZIONE PROCESSI IN UNIX 20

Sistemi Operativi Teledidattico

CREAZIONE DI UN FILE

Le system call: fork(), wait(), exit()

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

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

Laboratorio di Sistemi Operativi

Processi in Linux. Stru/ura file eseguibili

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

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

Funzioni. Il modello console. Interfaccia in modalità console

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ&


Gestione dei processi

Introduzione al Linguaggio C

I/O su Socket TCP: read()

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

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

Controllo dei Processi. M. R. Guarracino - Primitive di Controllo dei Processi

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3

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

System calls. permettono ai programmi utente di richiedere servizi al Sistema Operativo. servizi come scrittura di file, stampa su video, ecc.

Digressione: man 2...

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

Elementi di Architettura e Sistemi Operativi

Gestione dei File in C

I SISTEMI OPERATIVI (1)

Per operare su un file abbiamo bisogno di aprirlo, scriverlo, leggerlo, chiuderlo:

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

Î Modello ad Ambiente Locale P1 P1. File System P2 P2 P3 P3. Processi in UNIX. Modello di Processo in UNIX

Sistemi Operativi. Esercitazione 2 Compilazione, Makefile e Processi

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3

Processi in UNIX. Spazio di sistema (residente) Tabella dei. file APERTI OPEN FILE. Tabella dei codici

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

System call per l accesso a file

IPC System V. Code di messaggi

Laboratorio di Sistemi Operativi

I Processi nel SO UNIX

Esercitazione 4. Gestione dei file in Unix

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

Esercizio 2. Client e server comunicano attraverso socket TCP

Fondamenti di Informatica 2

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

Calcolatori Elettronici Parte X: l'assemblatore as88

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Capitolo 3 -- Stevens

System call per la gestione di processi

Laboratorio di Sistemi Operativi

Chiamate di sistema. Pipe Flussi di I/O

System call per la gestione di processi

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Caratteri e stringhe Esercizi risolti

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

Sistemi Operativi. Marzo-Giugno 2011 matricole congrue 0 mod 3. Controllo dei processi - I

Pag. 1. modello di esecuzione parallela

1. Standard input 2. Standard output 3. Standard error

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI

Gestione delle stringhe in C

Processi e Sincronizzazione. Laboratorio Software C. Brandolese M. Grotto

puntatori Lab. Calc. AA 2007/08 1

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

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

SISTEMI OPERATIVI. Linguaggio C e Linux. Diffusione dei linguaggi di programmazione IEEE Giorgio Giacinto 2016.

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati)

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

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

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

Matlab: Gestione avanzata dei file

Processi: Exit, Wait, Exec

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario

Lezione 21. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread

Laboratorio di Sistemi Operativi primavera 2009 open

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

SmallShell Piccolo processore comandi

Comandi. Sistema Operativo

Politecnico di Torino

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

Transcript:

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

Sommario Esercizi sulla gestione dei processi Creazione di un nuovo processo: fork Sincronizzazione tra processi: wait 2

- Gestione dei processi - Creazione processi: la funzione pid_t fork(void) Istruisce il kernel Unix a creare un nuovo processo da un processo esistente. Il processo creato viene detto figlio. Il processo che chiama fork viene detto genitore 3

Gestione dei processi - Ogni chiamata a fork (vfork) ha due ritorni: Al genitore viene restituito l identificativo del figlio Al figlio viene restituito l identificativo 0. 4

Esercizio n 0 fork - 0.A) Si realizzi un programma C esempioafork.c che stampi a video il pid del processo che lancerà un fork e dopo l esecuzione (fork), sia in grado di identificare i processi genitore e figlio con i relativi pid testando i valori di ritorno da fork. Esecuzione: $ esempioafork.out Output $ Unico processo con (PID: numpid) che lancia la fork Sono il padre con (PID: numpid). con un proc. figlio (PID: numpid) Sono il figlio con (PID: numpid) Suggerimento: Per ottenere il pid del processo padre utilizzare la funzione getpid(void) pid_t 5

Soluzione Esercizio n 0.A /* necessari per fork() */ #include <sys/types.h> #include <unistd.h> /* necessario per printf() */ #include <stdio.h> int main() { int pid; printf("unico processo con (PID: %d).\n",getpid()); pid = fork(); if (pid == 0) {/* codice eseguito dal figlio */ printf( Sono il figlio con (PID : %d).\n",getpid()); else if (pid > 0) {/* codice eseguito dal padre */ printf( Sono il padre con (PID: %d). con un proc. figlio (PID: %d)\n",getpid(),pid); else {/* codice eseguito dal padre in caso di errore */ printf("si e' verificato un errore nella chiamata a fork.\n"); exit(1); exit(0); 6

Esercizio n 0 fork - 0.B) Si modifichi il programma esempiobfork.c in modo che possa ricevere come input un numero intero immesso da tastiera. A tale numero, il processo figlio creato somma 15, mentre il processo padre somma 10 Esecuzione: $ esempiobfork.out <valore> Output: Processo padre Pid: numpid valore = <valore> + 10 Processo figlio Pid: numpid valore = <valore> + 15 7

Soluzione Esercizio n 0.B /* necessari per fork() */ #include <sys/types.h> #include <unistd.h> /* necessario per atoi() */ #include <stdlib.h> /* necessario per printf() */ #include <stdio.h> int main(int argc,char **argcv) { int valore = 0; if ( 1 < argc ) valore = atoi( argcv[ 1 ] ); printf("unico processo con PID %d.\n",getpid()); int pid = fork(); if (pid == 0) {/* codice eseguito dal figlio */ printf( "figlio [pid: %d]> valore iniziale= %d\n", getpid(), valore ); valore += 15; printf( "figlio [pid: %d]> valore finale= %d\n", getpid(), valore ); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 8

Soluzione Esercizio n 0.B else if (pid > 0) { /* codice eseguito dal padre */ printf("padre [pid: %d]> generato un figlio; il suo pid e' %d\n",getpid(), pid); printf( "padre [pid: %d]> valore = %d\n", getpid(), valore ); valore += 10; printf( "padre [pid: %d]> valore finale= %d\n", getpid(), valore ); else { /* codice eseguito dal padre in caso di errore */ printf("padre [pid: %d]> problemi durante creazione del figlio.\n",getpid()); exit(1); exit(0); 9

- Gestione dei processi - Sincronizzazione tra processi: La funzione pid_t wait(int *status) Grazie alla funzione wait, il padre attende la terminazione del processo figlio. Restituisce il pid del processo terminato -1 in caso di errore: ad esempio se un processo non ha figli status contiene il valore di uscita del figlio 10

- Gestione dei processi - Stato d uscita del figlio: True se il processo termina normalmente Restituisce lo stato del processo 11

WIFEXITED(stat_val) Valutata non-zero se il figlio termina normalmente WEXITSTATUS(stat_val) se il valore di WIFEXITED(stat_val) è non-zero valuta gli 8 bit dello status passato dal figlio con _exit() o exit(), oppure il valore restituito dal main(). WIFSIGNALED(stat_val) valutato con valore non-zero lo status restituito dal figlio terminato da un segnale non catturato (vedi <signal.h>). WTERMSIG(stat_val) se il valore di WIFSIGNALED(stat_val) è nonzero, la macro valuta il numero del segnale che ha causato la terminazione del figlio. WIFSTOPPED(stat_val) valutato a non-zero se lo status è di un figlio in stop. WSTOPSIG(stat_val) se il valore di WIFSTOPPED(stat_val) è non-zero, questa macro valuta il numero del segnale che ha causato lo stop del figlio.

Esercizio n 1 fork + wait - Scrivere un programma C che prenda come parametro un file inputfile (controllare che il numero di argomenti passati sia corretto). Il programma dovrà aprire tale file, creare un processo figlio, PF che scriverà nel file inputfile una stringa inserita da tastiera. Il padre attenderà il figlio e visualizzerà sul video il contenuto del file inputfile Esecuzione: $ esempioforkwait.out <nome_file> Introduci una stringa e premi [Enter] Output: Il padre ha letto la stringa <aaaaaaaaaa> 13

Soluzione Esercizio n 1 #include <stdio.h> /* perror */ #include <errno.h> /* perror */ #include <unistd.h> /* write, lseek, close, exit */ #include <sys/types.h> /*open, lseek */ #include <sys/stat.h> /*open */ #include <fcntl.h> /*open*/ int main (int argc, char **argv) { int fd,pid, pid_processo; int nread,nwrite,status; char st1[256]; /*Stringa lunga 256 caratteri*/ char st2[256]; /*Stringa lunga 256 caratteri*/ if (argc!= 2) {fprintf(stderr,"uso: %s nomefile\n",argv[0]); exit(1); /* Apertura del file in lettura e scrittura */ if ((fd=open(argv[1], O_RDWR O_CREAT, S_IRUSR S_IWUSR))<0) {perror("opening argv[1]"); exit(1); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 14

Soluzione Esercizio n 1 if((pid=fork())<0)/*creazione processo figlio*/ { perror("fork"); exit(-1); else if (pid==0) /* Processo figlio */ { printf("introduci una stringa e premi [Enter]\n"); scanf("%s",st1); /* Il figlio eredita il descrittore fd dal padre */ nwrite= write(fd,st1,strlen(st1)); /* L' I/O pointer si e' spostato alla fine del file */ exit(0); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 15

Soluzione Esercizio n 1 else { /* pid > 0 : Processo padre */ /* Attesa della terminazione del figlio */ pid_processo = wait(&status); /* Con un solo figlio generato, pid_processo è uguale a pid */ /* Riposizionamento all'inizio del file */ lseek(fd,0,seek_set); if( (nread = read(fd,st2,256)) <0) { perror("read "); exit(-1); printf("il padre ha letto la stringa %s\n",st2); close(fd); exit(0); 16

Esercizio n 2 fork + wait - Scrivere un programma C che prenda come parametro due nomi di file inputfile ed outputfile (controllare che il numero di argomenti passati sia corretto) il programma dovrà generare un processo figlio, PF che aprirà il file inputfile copiando i primi 40 caratteri di inputfile in outputfile aggiungendo alla fine il proprio PID. Il padre attenderà il figlio ed aggiungerà ad outputf il proprio PID. Esempio inputfile 1111111111222222222233333333334444444444555555555566666 66666 Esempio di esecuzione:./a.out <inputfile> <outputfile> 17

Soluzione Esercizio n 2 #include <stdio.h> /* perror */ #include <errno.h> /* perror */ #include <unistd.h> /* write, lseek, close, exit */ #include <sys/types.h> /*open, lseek */ #include <sys/stat.h> /*open */ #include <fcntl.h> /*open*/ #define READLENGTH 40 #define WRITELENGTH 40 main(int argc, char **argv) { int infile, status, oufile, pid, nread; int pid_processo; char buf[40]; char id[10]; if (argc!= 3) { printf (" uso: nomeprogramma <inputfile> <outputfile> \n"); exit (1); /* Apertura file outputfile*/ if ((oufile=open(argv[2], O_RDWR O_CREAT, S_IRUSR S_IWUSR)) <0) { printf("errore apertura outputfile %s\n:",argv[2]); exit(1); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 18

Soluzione Esercizio n 2 /*Esecuzione fork*/ if ((pid = fork()) == -1) {perror("fork"); exit(1); else if (pid == 0) /*Processo figlio*/ { /* Apertura file inputfile*/ if ((infile=open(argv[1], O_RDONLY)) <0) { printf("errore apertura inputfile da leggere %s\n:",argv[1]); exit(1); /*legge i primi 40 caratteri*/ if ( (nread = read(infile, buf, READLENGTH)) <= 0) { close(infile); exit(1); /*scrive i primi 40 caratteri*/ if ( (write(oufile, buf, WRITELENGTH )) <= 0) { close(oufile); exit(1); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 19

Soluzione Esercizio n 2 sprintf(id, "(PID:%d) PF ", getpid()); if ( (write(oufile, id, strlen(id))) <= 0) { close(oufile); exit(1); /* chiude il proprio file descriptor */ close(infile); exit(0); else { /*Processo Padre*/ pid_processo = wait(&status); /*Attende che il figlio finisca di scrivere*/ printf("inizio processo padre\n"); sprintf(id, "(PID:%d) Padre", getpid()); /*scrive i PID caratteri*/ if ( (write(oufile, id, strlen(id))) <= 0) { close(oufile); exit(1); close(oufile); printf("fine processo padre\n"); exit(0); 20

Esercizio n 3 fork + wait - Scrivere un programma C che prenda come parametro due nomi di file inputfile ed outputfile (controllare che il numero di argomenti passati sia corretto) il programma dovrà creare un processo figlio, PF che aprirà il file inputfile e scriverà i primi 10 caratteri e gli ultimi 10 nel file outputfile. Il padre attenderà il figlio e visualizzerà sul video il contenuto del file outputfile Esempio inputfile 1111111111222222222233333333334444444444555555555566666 66666 Esempio di esecuzione:./a.out <inputfile> <outputfile> Outuput: Padre: <11111111116666666666> 21