Processus - Polytechnique Montréal
Transcription
Processus - Polytechnique Montréal
Processus • Qu’est ce qu’un processus ? • États d’un processus • Hiérarchie des processus • Gestion des processus sous UNIX/LINUX – – – – – • Création de processus Remplacement d’espace d’adressage Attente de la fin d’un processus fils Terminaison de processus Partage de fichiers entre processus Gestion des processus sous Windows – Création de processus – Attente de la fin d’un processus fils – Terminaison de processus Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 1 Qu’est ce qu’un processus ? • Le concept processus est le plus important dans un système d’exploitation (SE). Tout le logiciel d’un ordinateur est organisé en un certain nombre de processus (processus système, processus utilisateur). Hypothèse : Nous supposons, dans ce qui suit, que chaque processus a un seul flot d’exécution (un seul thread). Le cas de plusieurs flots d’exécution sera traité lors de la séance suivante. • Un processus est un programme en cours d’exécution. Il est caractérisé par : – – – – – – – – Un numéro d’identification unique (PID); Un espace d’adressage (code, données, piles d’exécution); Un état principal (prêt, en cours d’exécution (élu), bloqué, …); Les valeurs des registres lors de la dernière suspension (CO, PSW, Sommet de Pile…); Une priorité; Les ressources allouées (fichiers ouverts, mémoires, périphériques …); Les signaux à capturer, à masquer, à ignorer, en attente ainsi que les actions associées; Autres informations indiquant, notamment, son processus père, ses processus fils, son groupe, ses variables d’environnement, les statistiques et les limites d’utilisation des ressources…. • Le système d’exploitation maintient dans une table appelée «table des processus» les informations sur tous les processus créés (une entrée par processus : Bloc de Contrôle de Processus PCB). • Cette table permet au SE de localiser et gérer tous les processus. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 2 1 Qu’est ce qu’un processus ? (2) Table des processus PCB = informations concernant l’état, la mémoire et les ressources du processus Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 3 Qu’est ce qu’un processus ? (3) Table des processus • Dans la plupart des systèmes d’exploitation, le PCB est composé de deux zones : – La première contient les informations critiques dont le système a toujours besoin (jamais swappée); – La deuxième contient les informations utilisées uniquement lorsque le processus est à l’état élu. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 4 2 Qu’est ce qu’un processus ? (4) Exemple d’utilisation de la table des processus : Changement de contexte Programme A Mode utilisateur Mode kernel Programme B Mode utilisateur exécution Sauvegarder état dans PCB A interruption Charger état de PCB B exécution Sauvegarder état en PCB B interruption Charger état de PCB A exécution Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 2. 5 États d’un processus Expiration Attente d’admission File des prêts Fin d’exécution Process eur Processeur File des bloqués Fin Terminaison Mise en attente d’1 evt Attente d’événement Nouveau Exécution Suspension par le SE Élection par le SE Admission Arrivée de l’evt Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 6 3 États d’un processus (2) Cas d’Unix fork Création Préemption Retour à usager Exécution Mode user Mémoire insuffisante Mémoire suffisante suspension Retour Interruption ou Appel système Hors mémoire Élection Exécution Mode noyau Prêt en mémoire Prêt hors mémoire En mémoire Mise en attente d’un evt Arrivée de l’evt Arrivée de l’evt terminaison Zombie Systèmes d’exploitation attente en mémoire Hors mémoire Génie Informatique École Polytechnique de Montréal Attente hors mémoire Chapitre 2. 7 États d’un processus (3) Cas de Windows XP Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 8 4 Hiérarchie des processus • Le système d’exploitation fournit un ensemble d’appels système qui permettent la création, la destruction, la communication et la synchronisation des processus. • Les processus sont créés et détruits dynamiquement. • Un processus peut créer un ou plusieurs processus qui, à leur tour, peuvent en créer d’autres. • Dans certains systèmes (MS-DOS), lorsqu’un processus crée un processus, l’exécution du processus créateur est suspendue jusqu’à la terminaison du processus créé (exécution séquentielle). • Dans Windows, les processus créateurs et créés s’exécutent en concurrence et sont de même niveau (exécution asynchrone mais pas de relation hiérarchique explicite gérée par le SE). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 9 Hiérarchie des processus (2) Cas d’UNIX • Le programme amorce charge une partie du système d’exploitation à partir du disque (disquette ou CD) pour lui donner le contrôle. Cette partie détermine les caractéristiques du matériel, effectue un certain nombre d’initialisations et crée le processus 0. • Le processus 0 réalise d’autres initialisations (ex. le système de fichier) puis crée deux processus : init de PID 1 et démon des pages de PID 2. • Ensuite, d’autres processus sont crées à partir du processus init. • Dans le cas de linux, on a, parmi d’autres, les processus kswapd, xfs et khubd. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 10 5 Hiérarchie des processus (3) Cas de Windows XP • Chaque processus pointe vers le processus parent (processus créateur). • Si le parent se termine, il n’y a pas d’actualisation de cette information. • Il se peut donc qu’un processus pointe vers un parent inexistant. Cela ne cause aucun problème puisque rien ne dépend de cette information de parenté. • Windows ne gère de lien qu’avec l’ID du processus parent, pas avec le parent du parent, etc. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 11 Processus d’UNIX • Chaque processus a un numéro d’identification unique (PID). L’appel system getpid() permet de récupérer le PID du processus : int getpid(); • Chaque processus a un père, à l’exception du premier processus créé (structure arborescente). S’il perd son père (se termine), il est tout de suite adopté par le processus init de PID 1. L’appel système getppid() permet de récupérer le PID de son processus père. • Un processus père s’exécute en concurrence avec ses fils (exécution asynchrone). • Un processus fils peut partager certaines ressources (mémoire, fichiers) avec son processus père ou avoir ses propres ressources. Le processus père peut contrôler l’usage des ressources partagées. • Le processus père peut avoir une certaine autorité sur ses processus fils. Il peut les suspendre, les détruire (appel système kill), attendre leur terminaison (appel système wait) mais ne peut pas les renier. • La création de processus est réalisée par duplication de l’espace d’adressage et de certaines tables du processus créateur (l’appel système fork). La duplication facilite la création et le partage de ressources. Le fils hérite des résultats déjà calculés par le père. • Un processus peut remplacer son code exécutable par un autre (appel système exec). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 12 6 Processus d’UNIX (2) : Processus shell (très simplifié) Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 13 Processus d’UNIX (3) : Cas d’UNIX : Lancement de la commande ls à partir du shell Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 14 7 Processus d’UNIX (4) : Création de processus (appel système fork) • La création de processus sous UNIX est réalisée au moyen de l’appel système : fork(); • L’appel système fork : – associe un numéro d’identification (le PID du processus); – ajoute puis initialise une entrée dans la table des processus (PCB). Certaines entités comme les descripteurs de fichiers ouverts, le répertoire de travail courant, la valeur d’umask, les limites des ressources sont copiées du processus parent; – duplique l’espace d’adressage du processus effectuant l’appel à fork (pile+données); – duplique la table des descripteurs…. • La valeur de retour est : – 0 pour le processus créé (fils). – le PID du processus fils pour le processus créateur (père). – négative si la création de processus a échoué (manque d’espace mémoire ou le nombre maximal de créations autorisées est atteint). • Au retour de la fonction fork, l’exécution des processus père et fils se poursuit, en temps partagé, à partir de l’instruction qui suit fork. • Le père et le fils ont chacun leur propre image mémoire mais ils partagent certaines ressources telles que les fichiers ouverts par le père avant le fork. Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 2. 15 Processus d’UNIX (5) : Création de processus (appel système fork) Après le fork, • le père et le fils vont poursuivre leurs exécutions à partir de l’instruction qui suit l’appel au fork mais chacun a sa propre zone de données. (12339) • le père récupèrera dans sa variable p, le PID du fils créé; • le fils récupérera dans sa variable p la valeur 0. (12339) Systèmes d’exploitation (12340) Génie Informatique École Polytechnique de Montréal Chapitre 2. 16 8 Processus d’UNIX (6) Création de processus : Exemple 1 // programme tfork.c : appel système fork() #include <sys/types.h> // pour le type pid_t #include <unistd.h> // pour fork #include <stdio.h> // pour perror, printf int a=20; int main ( ) { pid_t x ; // création d’un fils switch (x = fork()) { case –1 : /* le fork a échoué */ perror("le fork a échoué !") ; break ; case 0 : /* seul le processus fils exécute ce « case »*/ printf("ici processus fils, le PID %d.\n ", getpid()) ; a+=10; break ; default : /* seul le processus père exécute cette instruction*/ printf(" ici processus père, le PID %d. \n", getpid()) ; a+=100; } // les deux processus exécutent ce qui suit printf("Fin du Process %d. avec a = %d\n", getpid(),a ) ; return 0 ; } Génie Informatique Chapitre 2. 17 Systèmes d’exploitation École Polytechnique de Montréal Processus d’UNIX (7) Création de processus : Exemple 1 (exécution) jupiter% gcc -o tfork tfork.c jupiter% tfork ici processus père, le PID 12339. ici processus fils, le PID 12340. Fin du Process 12340 avec a = 30. Fin du Process 12339 avec a = 120. jupiter% tfork ici processus père, le PID 15301. Fin du Process 15301 avec a = 120. ici processus fils, le PID 15302. Fin du Process 15302 avec a = 30. jupiter% Systèmes d’exploitation a du fils a du père a du père a du fils Génie Informatique École Polytechnique de Montréal Chapitre 2. 18 9 Processus d’UNIX (8) Création de processus : Exemple 2 // programme Arborescence.c : appel système fork() #include <sys/types.h> // pour le type pid_t #include <unistd.h> // pour fork #include <stdio.h> // pour printf int main ( ) { pid_t p; int i, n=5 ; for (i=1; i<n; i++) { p = fork(); if (p > 0 ) break ; printf(" Processus %d de père %d. \n", getpid(), getppid()) ; } sleep(1); // dormir pendant 1 seconde return 0 ; } Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation shell Processus d’UNIX (9) Création de processus : Exemple 2 (exécution) Processus 23706 i=1 fork() sleep(1) Processus 23707 printf(..) i=2 fork() sleep(1) Processus 23708 printf(..) i=3 fork() sleep(1) jupiter% gcc -o Arborescence Arborescence.c jupiter% Arborescence Processus 23707 de pere 23706 Processus 23708 de pere 23707 Processus 23709 de pere 23708 Processus 23710 de pere 23709 Systèmes d’exploitation Chapitre 2. 19 Processus 23709 printf(..) i=4 fork() Processus 23710 sleep(1) Génie Informatique École Polytechnique de Montréal printf(..) i=5 sleep(1) Chapitre 2. 20 10 Processus d’UNIX (10) Création de processus : Exemple 2 sans l’instruction sleep shell Processus 23706 Processus 23707 i=1 fork() terminaison printf(..) i=2 fork() terminaison Les fils qui deviennent orphelins sont adoptés par le processus init de PID 1 jupiter% gcc -o Arborescence Arborescence.c jupiter% Arborescence jupiter% Processus 23707 de pere 1 . Processus 23708 de pere 1 Processus 23709 de pere 1 Processus 23710 de pere 1 Processus 23708 printf(..) i=3 fork() Processus 23709 terminaison printf(..) i=4 fork() terminaison Processus 23710 printf(..) i=5 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 21 Processus d’UNIX (11) Remplacement d’espace d’adressage Appel système exec • Le système UNIX offre une famille d’appels système exec qui permettent à un processus de remplacer son code exécutable par un autre spécifié par path ou file. int execl(const char *path, const char *argv, …….); int execlp(const char *file, const char *argv, …….); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); • Ces appels permettent d’exécuter de nouveaux programmes. • Le processus conserve, notamment, son PID, l’espace mémoire alloué, sa table de descripteurs de fichiers et ses liens parentaux (processus fils et père). • En cas de succès de l’appel système exec, l’exécution de l’ancien code est abandonnée au profit du nouveau. • En cas d’échec, le processus poursuit l’exécution de son code à partir de l’instruction qui suit l’appel (il n’y a pas eu de remplacement de code). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 22 11 Processus d’UNIX (12) Remplacement d’espace d’adressage (2) Appel système exec : Exemple 3 // programme test_exec.c #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> int main () { char* arg[] = {“/bin/ps”, “f”, NULL}; printf(“Bonjour…..\n”); execvp(“/bin/ps”, arg); printf(“Echec de execvp\n”); printf("Erreur %s\n",strerror(errno)); return 0; } Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 23 Processus d’UNIX (13) Attente de la fin d’un processus fils : appel système wait • Les appels système wait(…) et waitpid(…) permettent à un processus père d’attendre ou de vérifier la terminaison d’un de ses fils : – int wait (int * status); – int waitpid( int pid, int * status, int options); • wait et waitpid retournent : – le PID du fils qui vient de se terminer, – -1 en cas d’erreur (le processus n’a pas de fils). – des informations concernant la terminaison du fils, dans le paramètre status. Ces informations peuvent être récupérées au moyen de macros telles que : • WIFEXITED(status) : fin normale avec exit • WIFSIGNALED(status) : tué par un signal • WIFSTOPPED(status) : stopé temporairement • WEXITSTATUS(status) : valeur de retour du processus fils ( exit(valeur)) • wait(status) et waitpid(-1,status,0) bloquent le processus appelant jusqu’à ce que l’un quelconque des fils du processus se termine. • waitpid(pid, status,0) avec pid>0, bloque le processus appelant jusqu’à ce que son fils pid se termine. • waitpid(pid, status, WNOHANG) vérifie seulement la terminaison, retourne 0 en cas de non terminaison (pas d’attente). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 24 12 Processus d’UNIX (14) Attente de la fin d’un processus fils : exemple 4 // programme parent.c #include <unistd.h> // pour fork et execl #include <sys/wait.h> // pour wait #include <stdio.h> //pour printf #define NULL 0 int main () { int p, child, status; p=fork() ; if ( p ==- 1) return – 1 ; if( p>0) // ce que fera le père { printf (" ici père[%d], mon fils[ %d] \n", getpid(), p); if ((child=wait(&status))>0) printf(" ici père[%d], Fin du fils[%d]\n",getpid(),child); printf(" Le père[%d] se termine \n", getpid()); } else // ce que le fils fera { if ((status=execl("/home/user/a.out", "a.out", NULL))==-1) printf("le programme n' existe pas : %d\n",status); else printf("cette instruction n’est jamais exécutée\n"); } return 0; } Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal // programme fils.c #include <stdio.h> #include <unistd.h> int main ( ) { printf(" ici programme fils [%d]\n", getpid()); return 0; } Le père attend la fin du fils Le fils change de code exécutable jupiter% gcc fils.c jupiter% gcc -o parent parent.c jupiter% parent ici père[10524], mon fils[10525] ici programme fils [10525] ici père[10524] Fin du fils[10525] Le père[10524] se termine jupiter% Chapitre 2. 25 Processus d’UNIX (15) Attente de la fin d’un processus fils : exemple 5 // programme test de execvp : texecvp.c #include <unistd.h> #include <stdio.h> #include <sys/wait.h> int main (int argc , char * argv[]) { if ( fork() == 0) // il s' agit du fils { // exécute un autre programme execvp( argv[1], &argv[1]) ; fprintf(stderr, "on ne peut exécuter %s\n ", argv[1]); } else if( wait(NULL)>0 ) printf(" Le père détecte la fin du fils\n"); return 0 ; } Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal jupiter% gcc –-o texecvp texecvp.c jupiter% texecvp date mercredi, 6 septembre 2000, 16:12:49 EDT Le père détecte la fin du fils jupiter% texecvp ugg+kjù on ne peut exécuter ugg+kjù Le père détecte la fin du fils jupiter% gcc -o fils fils.c jupiter% fils ici programme fils [18097] jupiter% texecvp fils ici programme fils [18099] Le père détecte la fin du fils Chapitre 2. 26 13 Processus d’UNIX (16) Terminaison de processus • Un processus se termine par une demande d’arrêt volontaire (appel système exit) ou par un arrêt forcé provoqué par un autre processus (appel système kill) ou une erreur. void exit(int vstatus); • Lorsqu’un processus fils se termine : – son état de terminaison est enregistré dans son PCB, – la plupart des autres ressources allouées au processus sont libérées. – le processus passe à l’état zombie (<defunct>). • Son PCB et son PID sont conservés jusqu’à ce que son processus père ait récupéré cet état de terminaison. • Les appels système wait(status) et waitpid.(pid, status, option) permettent au processus père de récupérer, dans le paramètre status, cet état de terminaison. • Que se passe-t-il si le père meurt avant de récupérer ces informations? • Si un processus est tué par un signal kill, ce signal est aussi envoyé à tous ses processus fils. Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 2. 27 Processus d’UNIX (17) Terminaison de processus fork Création Préemption Retour à usager Exécution Mode user Mémoire insuffisante Mémoire suffisante suspension Retour Interruption ou Appel système Hors mémoire Élection Exécution Mode noyau Prêt en mémoire Prêt hors mémoire En mémoire Mise en attente d’un evt Arrivée de l’evt Arrivée de l’evtl terminaison Zombie Détruit attente en mémoire père exécute wait Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Hors mémoire Attente hors mémoire Chapitre 2. 28 14 Processus d’UNIX (18) Terminaison de processus : exemple 6 // programme deuxfils.c #include <sys/wait.h> #include <stdio.h> #include <unistd.h> void fils(int i) ; int main() { int status; if(fork()) // création du premier fils { if ( fork()==0) // création du second fils fils(2) ; } else fils(1) ; if (wait(&status)>0) printf("fin du fils%d\n", status>>8) ; if (wait(&status)>0) printf("fin du fils%d\n", status>>8) ; return 0 ; } void fils(int i) { sleep(2) ; exit(i) ; } Systèmes d’exploitation jupiter% gcc -o deuxfils deuxfils.c jupiter% deuxfils fin du fils1 fin du fils2 jupiter% deuxfils fin du fils2 fin du fils1 Génie Informatique École Polytechnique de Montréal Chapitre 2. 29 Processus d’UNIX (19) Terminaison de processus : exemple 7 // programme exec_wait.c #include <unistd.h> Après le fork, le père remplace son #include <stdio.h> espace d’adressage par celui du #include <sys/types.h> programme attendre_fils.c int main ( ) { pid_t p = fork(); if( p != 0) { execlp(“./attendre_fils”, “./attendre_fils”, NULL); printf( “execlp a échoué\n”); exit(-1); } else { sleep(5); printf(“Je suis le fils \n”); exit(0); } } Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Les liens père /fils sont maintenus // programme attendre_fils.c #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> int main ( ) { printf( “J’attends le fils…\n”); wait(NULL); printf(“Le fils a terminé \n”); exit(0); } Chapitre 2. 30 15 Processus d’UNIX (20) Partage de fichiers entre processus père et fils • Le fork duplique la table des descripteurs de fichiers du processus père. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 31 Exercice Déterminez ce qui sera affiché à l' exécution de ce programme : // chaine_fork_wait.c int main(void) { int i, n=5; pid_t fils_pid; for (i=1; i<n; i++) { fils_pid = fork(); if (fils_pid > 0) { wait(NULL); break; } } printf("Processus %d avec pere %d\n",getpid(), getppid()); } Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 32 16 Processus Windows XP • Windows offre un certain nombre de fonctions pour permettre au programmeur et au système d’exploitation de manipuler les processus. • Un processus Windows se compose des éléments suivants: – Un identificateur unique appelé ID processus. – Un espace d’adressage virtuel privé qui est un ensemble d’adresses mémoires virtuelles utilisables par le processus. – Un programme exécutable qui définit le code et les données initiaux et qui est mappé dans l’espace d’adressage virtuel du processus. – Une liste de handles (gestionnaires) ouverts qui pointent vers diverses ressources systèmes telles que les sémaphores, les ports de communication, les fichiers …., qui sont accessibles à tous les threads du processus. – Un contexte de sécurité appelé jeton d’accès qui identifie l’utilisateur, les groupes de sécurité et les privilèges associés au processus. – Au moins un thread d’exécution. • Les processus, threads, fichiers, sémaphores,… sont considérés comme des objets. À chaque objet est associé un ou plusieurs handles Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 33 Processus Windows XP (2) • Deux structures sont associés à chaque processus : – typedef struct _PROCESS_INFORMATION { // pi HANDLE hProcess, hThread; DWORD dwProcessId, dwThreadId; } PROCESS_INFORMATION; – typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved, lpDesktop, lpTitle; DWORD dwX, dwY; DWORD dwXSize, dwYSize; DWORD dwXCountChars, dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput, hStdOutput, hStdError; } STARTUPINFO, *LPSTARTUPINFO; Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 34 17 Processus Windows XP (3) Création d’un processus • Il y a une création d’un processus Windows lorsqu’une application appelle une fonction de création de processus comme – – – – • CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW ou CreateProcessWithLogonW. BOOL CreateProcess( LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes BOOL bInheritHandles, // handle inheritance flag DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION ); Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 35 Processus Windows (4) Création de processus sous Windows #include <windows.h> #include <stdio.h> void ErrorExit (LPTSTR lpszMessage) void ErrorExit (LPTSTR lpszMessage) { int main( ) fprintf(stderr, "%s\n", lpszMessage); { STARTUPINFO si; ExitProcess(1); PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); } // fonction de gestion d’erreurs ZeroMemory( &pi, sizeof(pi)); si.cb = sizeof(si); // Start the child process. if( !CreateProcess( “Fils.exe”, //name or path of executable NULL, // no command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi ) // Pointer to PROCESS_INFORMATION structure. ) { ErrorExit( "CreateProcess failed." ); } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); return 0; } // Fichier Pere.cpp Systèmes d’exploitation void main ( ) { printf("Child sleeps 5s \n"); sleep(5000); printf("done \n"); }//fichier Fils.cpp Génie Informatique École Polytechnique de Montréal Chapitre 2. 36 18 Processus Windows (5) Création de processus sous Windows #include <windows.h> #include <stdio.h> void main( VOID ) { STARTUPINFO si; PROCESS_INFORMATION pi; DWORD status ; // address to receive termination status ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); if( !CreateProcess("child.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) { printf( "CreateProcess failed (%d).\n", GetLastError() ); ExitProcess(1); } WaitForSingleObject( pi.hProcess, INFINITE ); if(GetExitCodeProcess( pi.hProcess, &status)) printf("I am the father. My child has terminated with (%d). \n", status); else printf( "GetExitCodeProcess failed (%d).\n", GetLastError() ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); printf( “I am the father. Going to terminate.\n"); ExitProcess(0); } // fichier Father.cpp Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 37 Processus Windows (6) Création de processus sous Windows #include <windows.h> #include <stdio.h> #include <tchar.h> void main() { printf("I am the child. My Pid and Tid: (%d, %d).\n", GetCurrentProcessId(), GetCurrentThreadId()); printf( "I am the child. Going to sleep for 5 seconds. \n"); Sleep(5000); ExitProcess(10); // exit code for all threads }// fichier child.cpp I am the child. My Pid and Tid (1084, 1404). I am the child. Going to sleep for 5 seconds. I am the father. My child [1084:1404] has terminated with (10). I am the father. Going to terminate. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 2. 38 19