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



Похожие документы
AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

CREAZIONE PROCESSI IN UNIX 20

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

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

Programmazione multiprocesso

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

Elementi di Architettura e Sistemi Operativi

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

Capitolo 3 -- Silberschatz

Sistemi Operativi. Des crizione e controllo dei proces s i

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

Gestione dei processi

Processi in Linux. Igino Corona 20 Ottobre 2009

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

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

Esercizio sulla gestione di file in Unix

Inter Process Communication. Laboratorio Software C. Brandolese

Gestione dei processi

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

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

Codifica: dal diagramma a blocchi al linguaggio C++

GESTIONE INFORMATICA DEI DATI AZIENDALI

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Sistemi Operativi. Descrizione e controllo dei processi

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

System call per la gestione di processi

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

I puntatori e l allocazione dinamica di memoria

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

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Linguaggio C - Funzioni

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp KP Cap. 6 pp

MAGAZZINO.CPP January 2, 2008 Page 1

Corso di Programmazione Concorrente Processi. Valter Crescenzi

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Sistemi Operativi (modulo di Informatica II) I processi

2. I THREAD. 2.1 Introduzione

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Gestione dei File in C

Il simulatore SPIM SPIM

Introduzione al linguaggio C Gli array

Sistemi Operativi (M. Cesati)

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

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

I SISTEMI OPERATIVI (1)

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

Modello dei processi. Riedizione delle slide della Prof. Di Stefano

SISTEMI OPERATIVI 14 settembre 2015 corso A nuovo ordinamento e parte di teoria del vecchio ordinamento indirizzo SR

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

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

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

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Esercizi di programmazione in C

I Processi nel Sistema Operativo Unix

Politecnico di Torino

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Allocazione dinamica della memoria - riepilogo

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

PROGRAMMI LINGUAGGIO C

Funzioni. Il modello console. Interfaccia in modalità console

La struttura dati ad albero binario

Arduino: Programmazione

Транскрипт:

Le system call: fork(), wait(), exit() Di seguito viene mostrato un programma che fa uso di puntatori a funzione, nel quale si mette in evidenza il loro utilizzo. Programma A1 #include <signal.h> int add(a,b,c) int a; int b; int c; return (a+b+c); int molt(a,b) int a; int b; return a*b; int (*fp)(); int ris; ris = add(5,4,2); printf( il risultato dell addizione: %d\n, ris); ris = molt(2,13); printf( il risultato della moltiplicazione: %d\n, ris); fp = add; ris = fp(5,4,2); printf( il risultato dell addizione: %d\n, ris); fp = molt; ris = fp(2,13); printf( il risultato della moltiplicazione: %d\n, ris); M.Aprea 1

Di seguito viene mostrato un programma che accede all environment di un processo. Si evidenzia la alterazione della variabile environ[0]. questa modifica ha effetto solo all interno del proramma e non nell environment oriinario che, pertanto, permane inalterato. Programma A2 extern char **environ; int i; environ[0] = ulisse=5 ; for (i=0;environ[i]!= NULL; i++) printf( %s\n, environ[i]); getchar(); system( env ); exit(0); M.Aprea 2

Di seguito un programma che utilizza la fork per duplicare i processi. Si noti come dopo la fork il processo parent viene clonato nel processo figlio che eredita dal parent i quattro segmenti di un processo che sono: 1. data segment, 2. stack segment, 3. code segment, 4. environment Programma A3 int a; char b; a = 1; if (fork() == 0) printf( sono nel processo child\n ); printf( sono nel processo child\n ); printf( sono nel processo child\n ); exit(1); printf( sono nel processo parent\n ); while (a =1) b = getchar(); exit(2); M.Aprea 3

Il programma che segue mostra l utilizzo della fork che va in esecuzione solo se il dato in input e positivo. Percio la clonazione avviene solo in quest ultimo caso. Di rilievo l utilizzo della wait che inserita nel parent serve a sincronizzare child e parent. Essa blocca il parent nell attesa che finisca il child. Quando quest ultimo finisce essa lo cancella dalla memoria centrale dopo di che il parent va ad eseguire l istruzione successiva. Programma A4 #include <sys/types.h> int status; int pid, child_pid; in dato; printf( inserisci dato\n ); scanf( %d, &dato); if (dato > 0) printf( ulisse\n ); pid = fork(); printf( %d\n, pid); printf( ulisse\n ); printf( il dato introdorro e neativo\n ); child_pid = wait(&status); M.Aprea 4

Il proramma mostra come si implementa il ciclo principale di una shell. In sostanza si tratta di un ciclo continuo all interno del quale si visualizza il prompt e si lee la strina da input, dopo di che si biforca per eseguire, con la exec, il comando costituito dalla stringa, si attende l esecuzione del child e si ritorna al parent. Programma A5 #include <string.h> char *comando; int pid; system( clear ); fflush(stdin); comando = malloc(sizeof(char*)); while(1) printf( prompt : ); gets(comando); pid = fork(); if (pid == 0) eseclp(comando, comando, NULL); exit(); pid = wait(null); M.Aprea 5

Il programma utilizza una fork all interno di una funzione: la funzione restituisce due processi. Percio, dopo partorisci( maschio ) vi sono due processi, dopo partorisci( femmina ) vi sono quattro processi, dopo partorisci( ermafrodita ) vi sono otto processi. Programma A6 int partorisci(sesso) char ]sesso; if (fork() == 0) printf( \nil figlio e : %s, sesso); ; wait(null); printf(\nsono prima della fork ); partorisci( maschio ); printf( \nsono dopo la prima fork ); printf( \nsono prima della seconda fork ); partorisci( femmina ); printf( \nsono dopo la seconda fork ); printf( \nsono prima della terza fork ); partorisci( un ermafrodita ); printf( \nsono dopo la terza fork ); M.Aprea 6

Il proramma mostra come con la fork si possa generare due processi fratelli. Programma A7 int pid1, pid2, i; pid1 = fork(); /* GENERAZIONE DEL PRIMO FIGLIO */ if (pid1 == 0) /* SONO NEL PRIMO FIGLIO */ for (i01;i<=200;i++) /* CICLO DI SINCRONIZZAZIONE */ printf( SONO NEL FRATELLO 1 \n ); exit(1); /* SONO NEL SECONDO FIGLIO */ pid2 = fork(); /* GENERAZIONE DEL SECONDO FIGLIO */ if (pid2 == 0) for (i=1; i<=200;i++) /* CICLO DI SINCRONIZZAZIONE */ printf( SONO NEL FRATELLO 2 \n ); exit(2); /* SONO NEL PADRE */ wait(null); wait(null); printf( SONO NEL PADRE \n\n ); M.Aprea 7