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

Documenti analoghi
System call per la gestione di processi

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

I Processi nel SO UNIX

Controllo dei Processi 1

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

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

I Processi nel Sistema Operativo Unix

Corso di Programmazione Concorrente Processi. Valter Crescenzi

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

System Calls per la Gestione dei Processi

Processi Concetti di base. Esecuzione parallela e sequenziale Il concetto di processo Gestione dei processi

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

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

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

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

Sistemi Operativi Teledidattico

Gestione dei processi

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

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

Programmazione multiprocesso

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli:

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

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

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

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

1. PARALLELISMO E PROCESSI. 1.1 La necessità del parallelismo

Gestione dei processi

La famiglia di system call exec. Modulo 6. Laboratorio di Sistemi Operativi I Anno Accademico

Processi: Exit, Wait, Exec

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

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

POSIX Systems Programming. geek evening 0x0d. ambienti POSIX. By lord_dex ZEI e Salug! presentano:

Il sistema operativo LINUX Indice

Programmazione di sistema in Linux: System Call per il controllo processi. E. Mumolo, DIA

Programmazione di Sistema 3

Signalling (IPC) Signalling (segnalazione)

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

Gestione dei processi. Marco Bonola Lezione tratta da

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

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

Progetto II: Il linguaggio C e le chiamate di sistema sui processi

Processi in Unix. Capitolo 8 -- Stevens

Sistemi Operativi T. Esercizi

L ambiente di un processo (I)

il tipo di parallelismo dipende dal grado di cooperazione

Program m azione di Sistem a 3

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

Riepilogo sulla Concorrenza

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

Esercitazione n. 8. Processi

SmallShell Piccolo processore comandi

Corso di Laboratorio di Sistemi Operativi

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

Processi in Linux. Stru/ura file eseguibili

Introduzione. P4 termina prima di P3, P2 e P3 prima di P1 P1 P2 P3 P4 P1 P1 P2 P3 P4. Padre. P1,..., P4 sono processi. Figlio

Esame Laboratorio di Sistemi Operativi Cognome Nome Mat.

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

CREAZIONE PROCESSI IN UNIX 20

SC per Inter Process Comminication. Pipe senza nome e con nome (FIFO)

SC che operano su processi. Fork, exec, etc...

Esercizio sulla gestione di file in Unix

SC per Inter Process Communication. Pipe senza nome e con nome (FIFO)

La Comunicazione tra Processi in Unix

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

CREAZIONE DI UN FILE

Sistemi Operativi. Esercitazione 2 Compilazione, Makefile e Processi

Comandi. Sistema Operativo

Chiamate di sistema. Pipe Flussi di I/O

Sistemi Operativi. Des crizione e controllo dei proces s i

Processi. Introduzione. Effective user/group id. Fork

uid_t getuid(void); //real-user-id del chiamante getegid(void); //effective-user-id del chiamante gid_t getgid(void); //real-group-id del chiamante

ACSO Programmazione di Sistema e Concorrente

Laboratorio di Sistemi Operativi

Sistemi Operativi. 7 Gestione dei processi in Unix

Sincronizzazione tra processi UNIX: i segnali. Sincronizzazione tra processi

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

I SISTEMI OPERATIVI (1)

Concetto di Processo Scheduling dei Processi Operazioni sui Processi Processi cooperanti Comunicazione tra processi

Programmazione di sistema in UNIX. Immagine di un processo in UNIX. Area dati. File comandi utente

2. Nucleo del sistema operativo (la gestione dei processi)

Sincronizzazione tra processi. Sincronizzazione tra processi. segnali. Segnali UNIX

Crea un nuovo processo. Al processo padre ritorna il PID del figlio. Al processo figlio ritorna 0

Sistemi Operativi. Descrizione e controllo dei processi

Esame Laboratorio di Sistemi Operativi Cognome Nome Mat.

Programmazione di sistema in Linux: System Call per i Segnali. E. Mumolo

Cosa e un processo? Stato del processo

Processi. Comunicazione tra processi Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Processi in Linux. Igino Corona 20 Ottobre 2009

Principles of Concurrent Programming

2. Nucleo del sistema operativo (la gestione dei processi)

Introduzione al Multithreading

Sistemi Operativi (M. Cesati)

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue 0 modulo 3

Processi: 1. Modelli a stati 2. Rappresentazione di processi 3. Liste di processi e scheduling 4. Processi in sistemi operativi attuali (NT/UNIX)

Sincronizzazione tra processi in Unix: : i segnali. Sistemi Operativi T AA

Sommario. Processi e Programmi. Che cosa e un Processo? Lezione 5 Processi e Threads

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

Sincronizzazione tra processi in Unix: i segnali

C: panoramica. Violetta Lonati

Sistemi Operativi. Lezione 4 I processi: implementazioni

Transcript:

La creazione di un nuovo processo in UNIX int fork(void); Viene creato un nuovo processo (figlio) identico (stesso codice, area dati copiata) al processo (padre) che ha invocato la fork Solo il valore di ritorno dalla fork è diverso per i due processi Figlio Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ; dispone di una area dati (utente e kernel) che è una copia (spesso on-write) di quella che ha il padre all'atto della fork; non vi è nessuna condivisione di memoria tra i processi padre e figlio (MOLTO IMPORTANTE) La duplicazione dell'area di kernel ha come effetto la duplicazione della tabella dei file aperti: i file aperti dal padre risultano aperti anche dal figlio con una condivisione degli I/O pointer /* pid vale PID Figlio (l'id del figlio) */ printf("pid vale %d\n",pid); /* pid vale 0 */ printf("pid vale %d\n",pid); le operazioni su uno stesso file condotte da una famiglia di processi modificano l'i/o pointer comune Sis.Op. A - UNIX - Programmazione di sistema 1 Schema di generazione if(fork() ==0) /* Codice eseguito dal figlio */ /* Codice eseguito dal padre */ I ruoli di padre e figlio sono relativi ad una specifica fork : il figlio può a sua volta generare altri processi Dopo la generazione del nuovo processo, padre e figlio sono processi indipendenti Il padre può decidere: se continuare la propria esecuzione concorrentemente a quella del figlio se attendere che il figlio termini (primitiva wait) Sis.Op. A - UNIX - Programmazione di sistema 2 Sis.Op. A - UNIX - Programmazione di sistema 3 Operazioni sui file I processi di una stessa famiglia non hanno una visione indipendente dei file aperti da un proprio avo Processo Processo Figlio file aperto file aperto file aperti del processo file aperti del processo i-node aperto Tabella degli I-node attivi I-node file aperti nel File System I/O pointer È possibile chiudere il file descriptor "ereditato" e riaprire di nuovo il file per avere un accesso indipendente Sis.Op. A - UNIX - Programmazione di sistema 4

Identificazione dei processi pid_t getpid(void); pid_t getppid(void); La getpid ritorna al processo il suo identificatore di processo (PID) La getppid ritorna al processo chiamante l'identificatore di processo del suo processo padre (PID del padre) Dalla fork il padre riceve il PID del processo figlio che deve invece invocare getpid per conoscere il proprio PID Sis.Op. A - UNIX - Programmazione di sistema 5 Attenzione alla fork Figlio2 Figlio1 Vengono creati 3 processi 2 dal padre 1 da un figlio Figlio1 Nipote Sincronizzazione tra padre e figlio #include <sys/types.h> pid_t wait(int *status); Il processo chiamante rimane bloccato in attesa della terminazione di uno tra i suoi figli (se i processi figli sono già terminati wait ritorna immediatamente) status contiene il valore di uscita del processo figlio: per ottenerlo (status >> 8) oppure WEXITSTATUS(status) se la wait ha successo il valore di ritorno è il pid del processo figlio che è terminato Con la variante waitpid è possibile ottenere informazioni sullo stato dei processi figli anche senza bloccare il processo chiamante Sis.Op. A - UNIX - Programmazione di sistema 7 Uso della wait int status; if(fork() ==0) /* Codice eseguito dal figlio */ /* Codice eseguito dal padre */ /* Attende che il figlio termini */ wait(&status); Nel caso di più figli pùo essere necessario attendere la terminazione di uno specifico figlio (pid): while ((rid = wait(&status))!= pid); Sis.Op. A - UNIX - Programmazione di sistema 6 Sis.Op. A - UNIX - Programmazione di sistema 8

Terminazione volontaria di un processo #include <stdlib.h> void exit(int status); void _exit(int status) Un processo termina volontariamente invocando la primitiva _exit oppure la funzione exit della libreria standard I/O del C oppure alla conclusione della funzione main (dove viene invocata automaticamente _exit); status è il valore di uscita che viene reso disponibile al padre attraverso la wait o le altre primitive (waitpid, ) _exit e exit chiudono tutti i file aperti del processo Esempio di uso della wait #include <stdio.h> #include <fcntl.h> int main (int argc, char **argv) int fd,pid, pid_processo; int nread,nwrite,status; char st1[256]; char st2[256]; 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 O_TRUNC,0644))<0) perror("opening argv[1]"); exit(-2); if((pid=fork())<0) perror("fork"); exit(-3); if (pid==0) /* Processo figlio */ /* Continua nella trasparenza successiva */ Sis.Op. A - UNIX - Programmazione di sistema 9 Terminazione involontaria di un processo Un processo termina involontariamente a seguito di: azioni non consentite: riferimenti ad indirizzi di memoria non assegnati al processo (SIGSEGV) esecuzione di codici di istruzioni non definite (SIGILL) segnali generati dall'utente da tastiera ^C (SIGINT) ^\ (SIGQUIT) con generazione del corefile segnali inviati da un altro processo mediante la primitiva kill (che vedremo più avanti) mediante il comando kill (ad es. kill -9 pidprocesso) Sis.Op. A - UNIX - Programmazione di sistema 10 Sis.Op. A - UNIX - Programmazione di sistema 11 Esempio /* continua 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)+1);/* per scrivere anche il '\0' */ /* L' I/O pointer si e' spostato alla fine del file */ exit(nwrite); /* 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(-4); printf("il figlio ha letto la stringa %s\n",st2); close(fd); return(0); exit(0); Sis.Op. A - UNIX - Programmazione di sistema 12

Esecuzione di un programma int execve (const char *filename, char *const argv[], char *const envp[]); Il processo chiamante passa ad eseguire il programma filename (file eseguibile o script): non è previsto il ritorno dalla chiamata a meno che non vi sia un errore (-1) Con argv e envp è possibile specificare gli argomenti e le variabili di ambiente che il programma riceve L'ambiente di esecuzione (codice e dati) del processo corrente viene modificato in quello del programma (senza che venga creato un nuovo processo - il PID rimane invariato): la fork crea un nuovo processo identico al padre la exec permette di modificare l'ambiente di esecuzione di un processo (in modo da renderlo diverso da quello del padre) Sis.Op. A - UNIX - Programmazione di sistema 13 Varianti della execve e: environment p: path v: params specificati come vettore l: params specificati come lista int execl( const char *path, const char *arg, ); int execlp( const char *file, const char *arg, ); int execle( const char *path, const char *arg,, char * const envp[]); int execv( const char *path, char *const argv[]); int execvp( const char *file, char *const argv[]); La execlp e la execvp ricercano il file nei direttori indicati nella variabile di ambiente $PATH (è un comportamento analogo a quello dello shell: non è necessario il path completo) Sis.Op. A - UNIX - Programmazione di sistema 14 Effetti delle primitive exec La gestione dei segnali (vista più avanti) viene alterata: se essi venivano ignorati rimangono tali se erano collegati a funzioni (handler) vengono riportati alla gestione di default Se il file eseguito hai il bit SUID attivo, gli identificatori effettivi del processo vengono modificati in quelli del proprietario del file eseguito, mentre quelli reali rimangono inalterati Si ereditano: direttorio corrente, maschera dei segnali, terminale di controllo ed altre informazioni Sis.Op. A - UNIX - Programmazione di sistema 15 Esempio di uso della execve #include <sys/types.h> int main() int status; pid_t pid; char *env[] = "TERM=vt100", "PATH=/bin:/usr/bin", (char *) 0 ; char *args[] = "cat", "f1", "f2", (char *) 0 ; if ((pid=fork())==0) /* Codice eseguito dal figlio */ execve("/bin/cat",args,env); /* Si torna qui solo in caso di errore/fallimento della execve*/ perror( exec ); exit(-1); /* Codice eseguito dal padre */ wait(&status); printf( Il processo %d e terminato con %d\n",pid,wexitstatus(status)); exit(0); Sis.Op. A - UNIX - Programmazione di sistema 16

Stato di zombie Quando un processo termina (o ucciso da un segnale di kill oppure avendo chiamato la exit() ) e il padre non ha ancora ricevuto la notifica della terminazione del figlio, il processo terminato assume lo stato di zombie. Un processo in stato <zombie> esiste solo nella tabella dei processi e non consuma risorse. Rimane in modo che il processo padre possa accedere al codice di uscita Stato di orfano Un processo si dice orfano se il suo processo padre è terminato; diventa quindi figlio di init(1); Sis.Op. A - UNIX - Programmazione di sistema 17 La gestione delle sessioni utente Un processo per ogni dispositivo di linea (terminale) attraverso il quale un utente può fare un login (vedi /etc/inittab) Il processo init (pid 1) è attivato dal kernel alla fine del bootstrap Esecuzione di un comando (in foreground) nello shell Sis.Op. A - UNIX - Programmazione di sistema 18