SC che operano su processi

Slides:



Advertisements
Presentazioni simili
PROCESS MANAGEMENT: STRUTTURE DATI
Advertisements

Programmazione concorrente
File System Cos’è un File System File e Directory
1 Semantica Operazionale di un frammento di Java: lo stato.
Gestione del processore
1 Processi e Thread Meccanismi di IPC, Inter Process Communication (1)
1 Reti di Calcolatori Esercitazione 1 Implementazione di un superserver Unix di rete Vedi: W.R. Stevens, Unix Network Programming, Prentice Hall Copyright.
I segnali.
1 Directory Il formato delle directory varia nei vari FS utilizzati in ambito Unix Quando una directory viene aperta viene restituito un puntatore a un.
1 System Call per Comunicazione tra Processi Pipe.
Mappare file in memoria
SC che operano su file (1)
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
File.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
eliana minicozzi linguaggi1a.a lezione2
Threads: Sistemi Operativi I Corso di Laurea in Ingegneria Informatica
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
I Thread.
DHTML: Modello degli Eventi 1. 2 Sommario Introduzione Evento onclick Evento onload Gestione errori con onerror Gestione mouse con levento onmousemove.
memoria gestita staticamente:
1 LINUX: struttura generale The layers of a UNIX system. User Interface.
Strutture di controllo in C -- Flow Chart --
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
File di testo, file binari
Dichiarazioni e tipi predefiniti nel linguaggio C
I File.
Le funzioni.
Sistemi Operativi - Introduzione 1 Il sistema operativo UNIX Dettagli e comandi avanzati Niccolò Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Sistemi Operativi - Shell 1 Elementi di programmazione concorrente Niccolo` Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Analisi di Immagini e Dati Biologici
Modulo 13: System call relative al File System
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Creazione progetto in C++/DEV
1 Scheduling in Windows 2000 Un thread entra in modalità kernel e chiama lo scheduler quando: Si blocca su un oggetto di sincronizzazione (semaforo, mutex,
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Gestione dei File. 2 Perché i file? Sono strutture dati persistenti Sono solitamente memorizzati sui dischi –Si usano dall'interno dei programmi Realizzano.
Unità Didattica 3 Linguaggio C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
14 marzo 2002 Avvisi:.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Costruzione di una semplice Agenda telefonica Elettronica Esercizio sull'uso delle principali system call Unix.
1 I segnali. 2 Prima un po’ di teoria…... 3 Stati dei processi in UNIX Idle Sleeping Zombified Runnable Running Fork iniziata waitpid Fork terminata.
T. MottaGenerazione e terminazione processi1 Creazione e terminazione dei processi Tommaso Motta
Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
1 Esercitazione Sistemi distribuiti: sistemi che risisedono su più calcolatori interconnessi da una rete di comunicazione Algoritmi distribuiti: programmi.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
1 SC che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 Chiamate di sistema Introduzione Errori : perror() Chiamate che lavorano su file.
Programmazione di sistema e gestione dei processi in C.
1 Chiamate di sistema Chiamate che lavorano su file.
1 SC per IPC Pipe. 2 Pipe : file speciali utilizzati per connettere due processi con un canale di comunicazione Se B cerca di leggere da una pipe vuota.
I segnali.
1.1 Il concetto di processo Un sistema operativo può eseguire una grande varietà di attività diverse:  sistemi batch – jobs;  sistemi time-shared – programmi.
1.1 Corso di Sistemi Operativi: Programmazione di Sistema Corso di Laurea in Informatica, Università di Firenze Anno accademico 2010/2011 Prof. Luca Ferrari.
1 Processi e Thread Processi e thread in Unix. 2 UNIX/Linux Molte versioni di UNIX –trattiamo le caratteristiche più comuni) Ci riferiamo allo standard.
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me ,
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
LINUX: struttura generale
Transcript della presentazione:

SC che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2

Process identifier: getpid,getppid pid indice del processo all’interno della tabella dei processi ppid indice del processo padre all’interno della tabella dei processi il kernel ha pid 0 e init ha pid 1 si possono ottenere con pid_t getpid(void) pid_t getppid(void)

PID: getpid,getppid (2) char buf[N]; /* stringa da stampare */ … /* frammento che stampa il pid del processo in esecuzione e quello del padre usando la macro WRITE di stampa (in sysmacro.h) … */ char buf[N]; /* stringa da stampare */ … sprintf(buf,”Processo %d, mio padre e’ %d\n.”, getpid(),getppid()); WRITELN(buf);

PID: getpid,getppid (2.1) #define STIN 0 #define STDOUT 1 /* da sysmacro.h … */ #define STIN 0 #define STDOUT 1 #define STDERR 2 #define WRITE(m) \ IFERROR(write(STDOUT,m,strlen(m)),m) #define WRITELN(m) WRITE(m); WRITE(m);

Creazione : fork() pid_t fork(void); crea un nuovo processo con indice pid lo spazio di indirizzamento del nuovo processo è un duplicato di quello del padre padre e figlio hanno due tabelle dei descrittori di file diverse (il figlio ha una copia di quella del padre) MA …. condividono la tabella dei file aperti (e quindi anche il puntatore alla locazione corrente di ogni file)

Creazione : fork() (2) pid_t fork(void); restituisce 0 al figlio e pid al padre, oppure -1 (solo al padre) in caso di fallimento es. la tabella dei processi non ha più spazio ...

Creazione di processi (2) Spazio di indirizzamento di padre e figlio dopo una fork terminata con successo copia 232 - 1 Stack 232 - 1 Stack Area vuota Area vuota heap Data heap Data Text Text SI padre SI figlio

Creazione di processi (3) Come prosegue l’esecuzione nei processi padre e figlio 232 - 1 Stack 232 - 1 Stack &x 45 &x Area vuota Area vuota PC = istruzione successiva a fork heap Data heap Data Text Text SI padre (pid=34) SI figlio (pid = 45)

Creazione di processi (4) /* frammento che crea un nuovo processo */ int pid; /* pid del processo creato */ … IFERROR( pid = fork(),”main: creazione”); if ( pid ) { /* siamo nel padre */ sprintf(buf,”Processo %d, ho creato %d\n.”, getpid(),pid); WRITELN(buf); } else { /* siamo nel figlio */ sprintf(buf,”Processo %d, mio padre e’ %d\n.”, getpid(),getppid()); WRITELN(buf); }

Terminazione : exit() void exit(int status); chiude tutti i descrittori di file, libera lo spazio di indirizzamento, invia un segnale SIGCHLD al padre salva il primo byte (0-255) di status nella tabella dei processi in attesa che il padre lo accetti (con la wait(), waitpid()) se il processo padre è terminato, il processo ‘orfano’ viene adottato da init (cioè ppid viene settato a 1) se eseguita nel main è equivalente ad una return

Attesa di terminazione del figlio pid_t wait(int *status) pid_t waitpid(pid_t pid,int *status,int options) restituisce informazioni sul tipo di terminazione del figlio e il byte meno significativo ritornato con la exit() per leggere queste informazioni c’è bisogno di opportune maschere WIFEXITED(status) WEXITSTATUS(status) in caso di errore (es non ci sono figli …) viene ritornato il valore -1

Attesa di terminazione ...(2) pid_t wait(int *status) pid_t waitpid(pid_t pid,int *status,int options) la waitpid permette di fare attese non bloccanti WNOHANG specificato nelle opzioni indica di non attendere se nessun figlio è ancora terminato permette di attendere un figlio con un pid specifico (pid)

Esempio : wait() ed exit() int status ; /* conterra’ lo stato */ IFERROR( pid = fork(),”main: creazione”); if ( pid ) { /* siamo nel padre */ sleep(20); /* aspetta 10 secondi */ pid = wait(&status); if (WIFEXITED(status)) { /*!=0 se il figlio e’terminato normalmente, (exit o return) non ucciso da signal */ printf(“stato %d\n”, WEXITSTATUS(status)); } else { /* siamo nel figlio */ printf(“Processo %d, figlio.\n”,getpid()); exit(17); /*termina con stato 17 */ }

Esempio : wait() ed exit() (2) cosa accade se eseguiamo un main contenente il codice dell’esempio : $ a.out & -- avvio l’esecuzione in bg Processo 1246, figlio. -- stampato dal figlio

Esempio : wait() ed exit() (3) prima che i 20 secoondi siano finiti ... $ a.out & -- avvio l’esecuzione in bg Processo 1246, figlio. -- stampato dal figlio $ ps -l … S UID PID PPID ………… CMD … Z 501 1246 1245 …………… a.out -- il figlio e’ un processo zombie

Esempio : wait() ed exit() (4) quando il padre si risveglia ed esegue la wait() ... $ a.out & -- avvio l’esecuzione in bg Processo 1246, figlio. -- stampato dal figlio $ ps -l … S UID PID PPID ………… CMD … Z 501 1246 1245 …………… a.out -- il figlio e’ un processo zombie (Z) $ Stato 17. -- stampato dal padre

Stati dei processi in UNIX Fork terminata Idle Runnable Fork iniziata L’evento accade scheduling Sleeping Running Attesa di un evento exit waitpid Zombified

Differenziazione : le exec() execve è l’unica chiamata di sistema vera execl, execlp,execle,execv, execvp sono funzioni di libreria con differenze sul tipo di parametri alla fine invocano la execve tutte le exec*() differenziano un processo rimpiazzando il suo spazio di indirizzamento con quello di un file eseguibile passato come parametro

Differenziazione : le exec() (2) execl, execlp,execle,execv, execvp, execve è possibile richiedere che la exec() cerchi il file nelle directory specificate dalla variabile di ambiente PATH è (p nel nome) è possible passare un array di argomenti secondo il formato di argv[] (v nel nome) è possible passare un array di stringhe che descrivono l’environment (e nel nome) è possibile passare gli argomenti o l’environment come lista (terminato da NULL) (l nel nome)

Differenziazione : le exec() (3) execl, execlp,execle,execv, execvp, execve le exec() non ritornano in caso di successo!!! Restituiscono -1 in caso di fallimento non trova il file, il file non è eseguibile etc... ATTENZIONE 1: le exec non creano nuovi processi!! ATTENZIONE 2: padre e figlio continuano a condividere la tabella dei file aperti ….

Differenziazione : le exec() (4) Formato di un file eseguibile risultato di compilazione, linking etc ... Numero che contraddistingue il file come eseguibile Magic number Ampiezza area di memoria occupata dalle variabili globali NON inizializzate Altre info Ampiezza BSS Variabili globali inizializzate I-Data segment Text segment Codice del programma (assemblato)

Differenziazione : le exec() (5) (1) il contenuto del file eseguibile viene usato per sovrascrivere lo spazio di indirizzamento del processo che la invoca Variabili di ambiente (envp) env 232 - 1 Agomenti (argv) argv Stack FRAME per la funzione main Area vuota BSS-segment Data Ampiezza BSS I-Data segment I-Data segment Text segment Text File eseguibile

Differenziazione : le exec() (6) (2) si carica in PC l’indirizzo iniziale X env 232 - 1 argv Indirizzo della prima istruzione compilata di main() Stack Area vuota BSS-segment X Ampiezza BSS I-Data segment I-Data segment Text segment Text X

Esempio : una shell semplificata int pid, status; char * argv[]; while (TRUE) { /*ciclo infinito*/ type_prompt(); /* stampa prompt*/ argv = read_comm(); /*legge command line*/ IFERROR3(pid = fork(),”Nella fork”,continue); if (pid) {/* codice padre */ wait(&status); if (WIFEXITED(status)) …/*gest. stato*/ } else {/*codice figlio*/ IFERROR(execvp(argv[0],argv),”nella execvp”); }

Duplicazione dei descrittori di file: dup() e dup2() int dup(int oldfd); int dup2(int oldfd,int newfd); creano entrambi una copia del descrittore di file oldfd , entrambi i descrittori puntano alla stassa locazione della tabella dei file aperti e possono essere utilizzati per lavorare sullo stesso file dup cerca la prima posizione libera dup2 chiude prima newfd (se aperto) e poi ci copia oldfd

Es: la redirezione La shell permette di ridirigere stdin/out/error Es. $ ls indirizzi.pdf k.c s.doc

Es: la redirezione La shell permette di ridirigere stdin/out/error Es. $ ls indirizzi.pdf k.c s.doc $ ls > pippo

Es: la redirezione La shell permette di ridirigere stdin/out/error Es. $ ls indirizzi.pdf k.c s.doc $ ls > pippo $ more pippo indirizzi.pdf k.c s.doc

Es: la redirezione (2) La shell permette di ridirigere stdin/out/error. Es (2) $ more pippo i.pdf s.doc k.c $ sort < pippo

Es: la redirezione (3) Redirezione dello stdout ed error su file diversi $ more pippo.c pluto.c 1> out 2> log

Es: la redirezione (3) Redirezione dello stdout ed error su file diversi $ more pippo.c pluto.c > out &> log

Es: la redirezione (3) Redirezione dello stdout ed error su file diversi $ more pippo.c pluto.c 1> out 2> log $ more log pippo.c: No such file or directory

Es: la redirezione (3) Redirezione dello stdout ed error su file diversi $ more pippo.c pluto.c 1> out 2> log $ more log pippo.c: No such file or directory $ more out /* frammento che stampa il pid del processo in esecuzione e quello del padre usando la macro WRITE di stampa (in sysmacro.h) … */ char buf[N]; /* stringa da stampare */ … sprintf(buf,”Processo %d, mio padre e’ %d\n.”, getpid(),getppid());

Es: la redirezione (3.1) Attenzione: out e log vengono sovrascritti!!!!! Per appendere usare ‘>>’ $ more pippo.c pluto.c 1>> out 2>> log

Es: la redirezione (3.1) Attenzione: out e log vengono sovrascritti!!!!! Per appendere usare ‘>>’ $ more pippo.c pluto.c 1>> out 2>> log $ more log pippo.c: No such file or directory

Es: redirezione con dup() e dup2() Es. voglio ridirigere lo standard output (file descriptor 1) su un file pippo int fd; ... IFERROR(fd=open(“pippo”,O_WRONLY|O_TRUNC|O_CREAT,0644),”nella open”); dup2(fd,STDOUT); /* duplica fd sullo standard output*/ close(fd); /* fd non serve piu’ */ printf(“Questo viene scritto in pippo!”);

Come la shell implementa la redirezione ... Es. $ ls -l > pippo Il processo shell si duplica con una fork()e si mette in attesa della terminazione del figlio con una wait Il figlio apre in scrittura il file pippo (creandolo o troncandolo) Il figlio duplica il descrittore di pippo con la dup2 sullo stdout e chiude il descrittore originario Il figlio invoca una exec di ls -l, la quale conserva i descrittori dei file, e quindi va a scrivere in pippo ogni volta che usa il file descriptor 1

Come la shell implementa la redirezione … (2) Es. $ ls -l > pippo (cont.) Quando il figlio termina, il padre riprende la computazione con i sui descrittori di file invariati. (padre e figlio hanno ognuno la sua tabella dei descrittori e casomai puntano alla stessa locazione della tabella dei file aperti)