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

Documenti analoghi
Gestione dei processi

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

Corso di Programmazione Concorrente Processi. Valter Crescenzi

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

System call per la gestione di processi

I Processi nel SO UNIX

I Processi nel Sistema Operativo Unix

Processi: Exit, Wait, Exec

Programmazione multiprocesso

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

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

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

Il sistema operativo LINUX Indice

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

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

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

CREAZIONE PROCESSI IN UNIX 20

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

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

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

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

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

Sistemi Operativi Teledidattico

Gestione dei processi

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

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

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

Sistemi Operativi. Des crizione e controllo dei proces s i

Programmazione di Sistema 3

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

Sistemi Operativi. Descrizione e controllo dei processi

INTERPROCESS COMMUNICATION 27

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

Processi in Linux. Stru/ura file eseguibili

Sistemi Operativi T. Esercizi

SmallShell Piccolo processore comandi

L ambiente di un processo (I)

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

Program m azione di Sistem a 3

Esercizi di Verifica Aprile 2005 Università disalerno

Cosa e un processo? Stato del processo

I SISTEMI OPERATIVI (1)

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Corso di Laboratorio di Sistemi Operativi

POSIX - Gestione dei Segnali. E.Mumolo, DEEI mumolo@units.it

PROGRAMMA DISCIPLINARE SVOLTO a. s / 2016

Sincronizzazione tra processi UNIX: i segnali. Sincronizzazione tra processi

Processi in Linux. Igino Corona 20 Ottobre 2009

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

Esercitazione n. 8. Processi

Directory. Le directory unix sono file.

Processi parte IV. Processi parte IV

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

Laboratorio in C su Processi e POSIX IPC (Inter Process Communications) Dalla nona lezione di laboratorio in avanti

ACSO Programmazione di Sistema e Concorrente

Sistemi Operativi. Esercitazione 2 Compilazione, Makefile e Processi

Esame Laboratorio di Sistemi Operativi Cognome Nome Mat.

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

PIPE. M. Guarracino - PIPE 1

Chiamate di sistema. Pipe Flussi di I/O

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

Elementi di Architettura e Sistemi Operativi

Sistemi Operativi. Lezione 3 I Processi

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

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

Laboratorio di Sistemi Operativi

Lezione 5. Processi e thread. Sistemi operativi. Marco Cesati System Programming Research Group Università degli Studi di Roma Tor Vergata

Corso di Laboratorio di Sistemi Operativi

Il sistema operativo LINUX Semafori. Semaforo. Sommario. Sommario. Uso delle pipe. Gestione di semafori tramite pipe. Sistemi operativi Modulo II

Processi - II. Franco Maria Nardini

Il linguaggio C. Puntatori e dintorni

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

Interprocess communication: Pipe

Quinta Esercitazione. Principali primitive di accesso ai File

Sistemi Operativi. Compito d esame 08 Settembre Versione A

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

Controllo di flusso negli script: if-then-else

SISTEMI OPERATIVI 3 febbraio 2014 corso A nuovo ordinamento e parte di teoria del vecchio ordinamento indirizzo SR

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

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

Gestione dinamica della memoria

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

CREAZIONE DI UN FILE

IPC System V. Code di messaggi

Lezione 8 Struct e qsort

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

SISTEMI OPERATIVI. I processi. Prof. Luca Gherardi Prof.ssa Patrizia Scandurra (anni precedenti) (MODULO DI INFORMATICA II)

Threads: 1. Concetti di base 2. Threads in sistemi operativi attuali (NT/UNIX)

Introduzione al Multithreading

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

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

I puntatori e l allocazione dinamica di memoria

Capitolo 5 -- Stevens

Capitolo 3 -- Silberschatz

Concetto di processo. Processi. Immagine in memoria di un processo. Stati di un processo. Un SO esegue una varietà di attività:

Sistemi operativi Modulo II I semafori 2 Select

Semafori. Semafori classici con i thread POSIX 2

Esercitazione 11. Esercitazione di riepilogo

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Transcript:

Marzo-Giugno 2008 matricole congrue 0 mod 3 Funzioni wait e waitpid quando un processo termina il kernel manda al padre il segnale SIGCHLD Controllo dei processi (2) il padre può ignorare il segnale (default) oppure lanciare una funzione (signal handler) in ogni caso il padre può chiedere informazioni sullo stato di uscita del figlio; questo è fatto chiamando le funzioni wait e waitpid. 2 Funzione wait #include <sys/types.h> #include <sys/wait.h> pid_t wait (int *statloc); Funzione waitpid #include <sys/types.h> #include <sys/wait.h> pid_t waitpid (pid_t pid, int *statloc, int options); Descrizione: chiamata da un processo padre ottiene in statloc lo stato di terminazione di un figlio Restituisce: PID se OK, -1 in caso di errore Descrizione: chiamata da un processo padre chiede lo stato di terminazione in statloc del figlio specificato dal pid 1 argomento; tale processo padre si blocca in attesa o meno secondo il contenuto di options Restituisce: PID se OK, 0 oppure -1 in caso di errore 3 4 1

Funzione waitpid pid == -1 (qualsiasi figlio...la rende simile a wait) pid > 0 (pid del figlio che si vuole aspettare) pid < -1 (qualsiasi processo con grpid = pid ) options = 0 (niente... come wait) WNOHANG disponibile) WUNTRACED (status di un figlio stopped ) WCONTINUED (status di un figlio continued ) (non blocca se process pid non è 5 differenze in generale con la funzione wait il processo si blocca in attesa (se tutti i figli stanno girando) ritorna immediatamente con lo stato di un figlio ritorna immediatamente con un errore (se non ha figli) un processo puo chiamare wait quando riceve SIGCHLD, in questo caso ritorna immediatamente con lo stato del figlio appena terminato waitpid può scegliere quale figlio aspettare (1 argomento) wait può bloccare il processo chiamante (se non ha figli che hanno terminato), mentre waitpid ha una opzione (WNOHANG) per non farlo bloccare e ritornare immediatamente 6 Terminazione di un processo Terminazione normale ritorno dal main chiamata a exit chiamata a _exit Terminazione anormale chiamata abort arrivo di un segnale interrupt generati da altri processi o dal kernel (p.e. quando si divide per zero) Terminazione in ogni caso il kernel esegue il codice del processo e determina lo stato di terminazione se normale, lo stato è l'argomento di exit, return oppure _exit altrimenti il kernel genera uno stato di terminazione che indica il motivo "anormale in entrambi i casi il padre del processo ottiene questo stato da wait o waitpid 7 8 2

Termination status Waitpid(pid, &status, options) Cosa succede quando un processo termina? WIFEXITED(status) True se status fa riferimento ad un figlio terminato regolarmente WEXITSTATUS(status) -> exit/_exit value WIFSTOPPED(status) True se status fa riferimento ad un figlio stopped WIFCONTINUED(status) True se stuatus fa riferimento ad un figlio ripartito dopo essere stato in stato di stopped WIFSIGNALED(status) True se status fa riferimento ad un figlio terminato in maniera anormale in seguito ad un segnale 9 Se un figlio termina prima del padre, allora il padre ottiene lo status del figlio con wait Se un padre termina prima del figlio, allora il processo init diventa il nuovo padre Se un figlio termina prima del padre, ma il padre non utilizza wait, allora il figlio diventa uno zombie 10 esempio: terminazione normale esempio: terminazione con abort pid_t pid; int status; pid_t pid; int status; pid=fork(); if (!pid) /* figlio */ exit(128); /* qualsiasi numero */ if (wait(&status) == pid) printf("terminazione normale\n"); if (!pid) /* figlio */ abort(); /* genera il segnale SIGABRT */ if (wait(&status) == pid) printf("terminazione anormale con abort\n"); 11 12 3

zombie.c int main() { pid_t pid; if ((pid=fork()) < 0) fprintf(stderr, "fork error"); else if (!pid){ /* figlio */ printf( pid figlio= \d,getpid()); exit(0); sleep(2); /* padre */ system("ps T"); /* dice che il figlio è zombie... STAT Z*/ exit(0); Race Conditions ogni volta che dei processi tentano di fare qualcosa con dati condivisi e il risultato finale dipende dall'ordine in cui i processi sono eseguiti sorgono delle race conditions se si vuole che un figlio aspetti che il padre termini si può usare: while ( getppid()!= 1) sleep(1); se un processo vuole aspettare che un figlio termini deve usare una delle wait 13 14 evitare le Race Conditions la prima soluzione spreca molta CPU, per evitare ciò si devono usare i segnali oppure qualche forma di IPC (interprocess communication). esempio di race conditions int main(void){ pid_t pid; if (!pid) {charatatime("output dal figlio\n"); else { charatatime("output dal padre\n"); exit(0); static void charatatime(char *str) {char *ptr; int c; setbuf(stdout, NULL); /* set unbuffered */ for (ptr = str; c = *ptr++; ) putc(c, stdout); 15 16 4

output dell'esempio figlio esegue prima del padre /home/studente > a.out output from child output from parent /home/studente > a.out oouuttppuutt ffrroomm cphairlednt... TELL_WAIT(); /* inizializzazione */ if (!pid){ /* figlio */ /* il figlio fa quello che deve fare */ TELL_PARENT( getppid() ); else{ /* padre */ WAIT_CHILD(); /* il padre fa quello che deve fare */ 17 18 figlio esegue prima del padre (esempio) padre esegue prima del figlio if (!pid){ /* figlio */ /* il figlio fa quello che deve fare */ else{ /* padre */ wait(); /* il padre fa quello che deve fare */ TELL_WAIT(); /* inizializzazione */ if (!pid){ /* figlio */ WAIT_PARENT(); /* il figlio fa quello che deve fare */ else{ /* padre */ /* il padre fa quello che deve fare */ TELL_CHILD(pid); 19 20 5

padre esegue prima del figlio (esempio) primitive di controllo #include <signal.h> void catch(int); int main (void) { if (!pid){ /* figlio */ signal(sigalrm,catch); pause(); /* il figlio fa quello che deve fare */ else{ /* padre */ /* il padre fa quello che deve fare */ kill(pid,sigalrm); void catch(int signo) { printf( parte il figlio ); fork creazione nuovi processi exec esecuzione nuovi programmi exit trattamento fine processo wait/waitpid trattamento attesa fine processo 21 22 Funzioni exec Funzioni exec fork di solito è usata per creare un nuovo processo (il figlio) che a sua volta esegue un programma chiamando la funzione exec. in questo caso il figlio è completamente rimpiazzato dal nuovo programma e questo inizia l'esecuzione con la sua funzione main non è cambiato il pid... l'address space è sostituito da un nuovo programma che risiedeva sul disco L unico modo per creare un processo è attraverso la fork L unico modo per eseguire un programma è attraverso la exec La chiamata ad exec reinizializza un processo: il segmento istruzioni ed il segmento dati utente cambiano (viene eseguito un nuovo programma) mentre il segmento dati di sistema rimane invariato 23 24 6

Funzioni exec #include <unistd.h> int execl (const char *path, const char *arg0,../* (char *) 0 */); int execv (const char *path, char *const argv[ ]); int execle (const char *path, const char *arg0,../*(char *) 0, char *const envp[ ] */); int execve (const char *path, char *const argv[ ], char *const envp[ ]); int execlp (const char *file, const char *arg0,../*(char *)0 */); int execvp (const char *file, char *const argv[ ]); Restituiscono: -1 in caso di errore non ritornano se OK. Funzioni exec - differenze Nel nome delle exec l sta per list mentre v sta per vector execl, execlp,execle prendono come parametro la lista degli argomenti da passare al file da eseguire execv, execvp,execve prendono come parametro l array di puntatori agli argomenti da passare al file da eseguire execlp ed execvp prendono come primo argomento un file e non un pathname, questo significa che il file da eseguire e ricercato in una delle directory specificate in PATH execle ed execve passano al file da eseguire la enviroment list; un processo che invece chiama le altre exec copia la sua variabile environ per il nuovo file (programma) 25 26 Relazione tra le funzioni exec Caratteristiche delle exec Funzioni Args Env PATH execl lista auto no execv vettore auto no execle lista man no execve vettore man no execlp lista auto si execvp vettore auto si 27 28 7

printf( Sopra la panca \n ); execl( /bin/echo, echo, la, capra, campa,null); $a.out Sopra la panca la capra campa $ $a.out>temp.txt $cat temp.txt la capra campa 29 esempio: echoenv.c #include <stdlib.h> extern **char environ; int main(){ int i = 0; while (environ[i]) printf("%s\n", environ[i++]); return (0); 30 esempio di execl[ep] #include <sys/types.h> #include <sys/wait.h> #include "ourhdr.h" char *env_init[ ]={"USER=studente", "PATH=/tmp", NULL ; int main(void){ pid_t pid; if (!pid) { /* figlio */ execle("/home/studente/echoenv","echoenv",(char*) 0,env_init); waitpid(pid, NULL, 0); printf("sono qui \n\n\n"); if (pid == 0){/* specify filename, inherit environment */ execlp("echoenv", "echoenv", (char *) 0); exit(0); 31 Funzione system #include <stdlib.h> int system (const char *cmdstring); Serve ad eseguire un comando shell dall interno di un programma esempio: system( date > file ); essa e implementata attraverso la chiamata di fork, exec e waitpid 32 8

Esercizio 1 Scrivere un programma che crei un processo zombie. Esercizio 2 Sia ELENCO.TXT un file contenente dei record del tipo: Cognome \t Nome. Fare in modo che un processo figlio diventi figlio del processo init. Scrivere un programma che utilizzi fork + exec per eseguire il programma ORDINA che creerà il file contenente i record in ordine alfabetico crescente. Tale programma avrà come parametri il nome del file da ordinare e il file da creare con i nomi ordinati. 33 34 Esercizio 3 Scrivere un programma che effettui la copia di un file utilizzando 2 figli: uno specializzato nella copia delle vocali ed uno nella copia delle consonanti. Per la sincronizzazione tra i processi figli utilizzare un semaforo implementato tramite file. 35 9