La creazione di un nuovo processo in UNIX

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

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

System call per la gestione di processi

System call per la gestione di processi

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

LABORATORIO DI SISTEMI OPERATIVI

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

I Processi nel SO UNIX

Controllo dei Processi 1

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

I Processi nel SO UNIX

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

I Processi nel SO UNIX

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

Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria Elettronica. SISTEMI OPERATIVI A.A. 2004/2005 Docente: Giorgio Giacinto

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

Laboratorio di Sistemi Operativi

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

SISTEMI&OPERATIVI& AA&2013&0&2014& Processi( in(linux( Giorgio&Giacinto&2013& Sistemi&Opera?vi&

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

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

I Processi nel Sistema Operativo Unix

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

System Calls per la Gestione dei Processi

Corso di Programmazione Concorrente Processi. Valter Crescenzi

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

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

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

Sistemi Operativi Teledidattico

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

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

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

Pag. 1. modello di esecuzione parallela

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

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

Programmazione multiprocesso

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

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

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

Corso di Laboratorio di Sistemi Operativi A.A

LINUX: struttura generale

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

Gestione dei processi

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

Processi: Exit, Wait, Exec

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

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

Richiami sui Concetti Fondamentali dei Processi

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

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

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

Programmazione di sistema e gestione dei processi in C

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

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

Gestione dei processi. Marco Bonola Lezione tratta da

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

Processi: system calls

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

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

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

Esercizio sulla gestione di processi in Unix!

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

Riepilogo sulla Concorrenza

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

Gestione dei processi

Il sistema operativo LINUX Indice

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

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

Programmazione di Sistema 3

La Programmazione di Rete e di Sistema (iii) La programmazione di sistema. Il sistema operativo. La programmazione di sistema

Signalling (IPC) Signalling (segnalazione)

Processi in Unix. Capitolo 8 -- Stevens

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Sistemi Operativi (M. Cesati)

Esercitazione 4. Gestione dei file in Unix

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

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

Sistemi Operativi T. Esercizi

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

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

Sistemi Operativi (M. Cesati)

Processi in Linux. Stru/ura file eseguibili

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

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

il tipo di parallelismo dipende dal grado di cooperazione

Programmazione di Sistema 3

Laboratorio di Sistemi Operativi primavera 2009

L ambiente di un processo (I)

Modulo 5 System call per il controllo dei processi (fork, exit, wait)

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

SmallShell Piccolo processore comandi

Gestione dei processi

Esercitazione n. 8. Processi

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

ESERCITAZIONE 2 fork e exec

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 1 a.a. 2011/2012

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

Transcript:

La creazione di un nuovo processo in UNIX #include <unistd.h> 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 Padre Padre pid = fork() ; Figlio /* pid vale PID Figlio (l'id del figlio) */ printf("pid vale %d\n",pid); /* pid vale 0 */ printf("pid vale %d\n",pid); Sis.Op. A - UNIX - Programmazione di sistema 1

Schema di generazione #include <unistd.h> if(fork() ==0) {/* Codice eseguito dal figlio */ else {/* 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

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 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 3

Operazioni sui file I processi di una stessa famiglia non hanno una visione indipendente dei file aperti da un proprio avo Processo Padre Una entry per ogni file aperto Tabella dei file aperti del processo Una entry per ogni i-node aperto Tabella degli I-node attivi I-node Processo Figlio Tabella dei file aperti del processo Tabella dei file aperti nel File System Una entry per ogni file aperto 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 #include <unistd.h> 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 Padre pid = fork() ; pid = fork() ; Padre pid = fork() ; Vengono creati 3 processi 2 dal padre 1 da un figlio Figlio1 Padre pid = fork() ; Figlio2 Figlio1 pid = fork() ; Nipote Sis.Op. A - UNIX - Programmazione di sistema 6

Sincronizzazione tra padre e figlio #include <sys/types.h> #include <sys/wait.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 */ else {/* 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 8

Terminazione volontaria di un processo #include <stdlib.h> void exit(int status); #include <unistd.h> 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 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

Esempio di uso della wait #include <stdio.h> #include <fcntl.h> #include <sys/wait.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); else if (pid==0) /* Processo figlio */ { /* Continua nella trasparenza successiva */ 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); 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(-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 #include <unistd.h> 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 #include <unistd.h> 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> #include <sys/wait.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); else { /* 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