Systèmes d'exploitation - Cours no. 14

De
Publié par

Syst`emes d’exploitationCours no. 14Jean-S´ebastien CoronUniversit´e du LuxembourgDecember 5, 2009Jean-S´ebastien Coron Syst`emes d’exploitationProgrammation en C sous UNIXLe recouvrement de processus.Rappel sur les processus UNIX.Rappel sur fork() et wait.Les fonctions execv() et execlp().Jean-S´ebastien Coron Syst`emes d’exploitationLes processusCr´eation d’un processus.Lorsqu’on entre une commande, le shell lance un processuspour l’ex´ecuter.Le shell attend la fin du processus, puis attend la commandesuivante.Arborescence de processus.Chaque processus a un p`ere, celui qui l’a lanc´e.Le num´ero du processus du p`ere est le PPID.Un processus p`ere peut avoir plusieurs processus filsSous UNIX, un premier processus init est cr´e´e avec un PIDde 1. Anc`etre de tous les processus.Jean-S´ebastien Coron Syst`emes d’exploitationCr´eation de processusDuplication d’un processus.Seule fac¸on de cr´eer un processus `a bas niveau.Appel syst`eme fork()Cr´ee une copie complˆete du processus, fils de ce processus.Le fils change de programme en appelant exec().La fonction exec() remplace le code et ses donn´ees par celuid’une nouvelle commande.Jean-S´ebastien Coron Syst`emes d’exploitationEx´ecution d’une commandeEx´ecution d’une commande: tar -zcvf file *Le shell se duplique avec fork(). On a alors deux processusshell identiques.Le shell p`ere attend la fin du processus fils avec wait().Le shell fils remplace son ex´ecutable par celui de la ...
Publié le : samedi 24 septembre 2011
Lecture(s) : 86
Nombre de pages : 13
Voir plus Voir moins
Syst`emesdexploitation
Jean-S
Cours no. 14
Jean-S´ebastienCoron
e´
Universite´duLuxembourg
b
December 5, 2009
astienCronoSyste`mesdepxlioatitno
CnronoyStse`emdsJean-S´ebastieitloxpe
Le recouvrement de processus. Rappel sur les processus UNIX. Rappel sur fork() et wait . Les fonctions execv() et execlp() .
nioattammenoirPargoIXsonCUNus
oreceLpssussJn-eaon
Cre´ationdunprocessus. Lorsqu’on entre une commande, le shell lance un processus pourlex´ecuter. Le shell attend la fin du processus, puis attend la commande suivante. Arborescence de processus. Chaque processus a un p`ere ,celuiquilalanc´e. Lenum´eroduprocessusdup`ereestlePPID. Unprocessusp`erepeutavoirplusieursprocessus fils Sous UNIX, un premier processus init estcr´e´eavecunPID de1.Anc`etredetouslesprocessus.
tatiseme`tsyiolpxedtiasebS´nSroCoen
sabe´S-naeJitneoCorSnsy`tmeesdexploitation
Duplication d’un processus. Seulefa¸condecre´erunprocessusa`basniveau. Appelsyste`me fork() Cr´eeunecopiecompleˆteduprocessus,lsdeceprocessus. Le fils change de programme en appelant exec() . La fonction exec() remplacelecodeetsesdonne´esparcelui d’une nouvelle commande.
dnpeorecsssuCr´eatio
Eutiox´ecneconduednamm
Exe´cutiondunecommande: tar -zcvf file * Le shell se duplique avec fork() . On a alors deux processus shell identiques. Leshellpe`reattendlanduprocessuslsavec wait() . Leshelllsremplacesonex´ecutableparceluidelacommande tar avec exec() La commande tar sexe´cute.Lorsquellesetermine,le processus fils disparait. Leshellp`ereestr´eactive´etattendlacommandesuivante.
nSyst`emtienCoroioatitnosedxelpsabe´S-naeJ
tion
L’appel a fork() duplique le processus. Lex´ecutioncontinuedanslesdeuxprocessus. Valeurretourne´epar fork() : Dansleprocessusp`ere,retournelePIDduls. Dans le processus fils, retourne 0. Silefork´echoue,renvoie-1. getpid() et getppid() getpid() retourne le PID du processus. getppid() retournelePIDdupe`reduprocessus.
rpaLievitimi()rkfontt`emesdexploitabesaitneoCorSnsyeaJS´n-
)ro(kExemvecfpleaJean-S´ebastieCnronoyStse`emdsitloxpe
#include <stdio.h> #include <unistd.h> int main() { int pidfils=fork(); if(pidfils!=0) { printf("Jesuislep`ere."); printf("PID de mon fils:%d\n",pidfils); } else { printf("Je suis le fils."); printf("Mon pid est:%d\n",getpid()); } }
nioat
mexEk(or)eaplcfveolpxedsnoitationornCieme`estSyeJnaabtsS-e´
R´sultat: e $ forksimple Jesuislep`ere.PIDdemonfils:2864 Je suis le fils.Mon PID est:2864 $ Peut aussi apparaˆıtre dans l’ordre inverse.
etititexaw´Sbeae-nJyst`ronSenCoastiiolpitatsemexed
La primitive wait permeta`unprocessusdattendrelan d’un de ses fils. Si pas de fils ou erreur, retourne -1. Sinon, retourne le PID du fils qui s’est termi ´ ne. Doitˆetreappeleavec wait(0) ´ La primitive exit permet de terminer le processus qui l’appelle. void exit(int status) status permetdindiquerauprocessusp`erequuneerreur s’est produite. status=0 si pas d’erreur.
on
Jeaebasn-S´plexdesontitaoioroCneitme`tsySnemExepl
int pidfils=fork();
if(pidfils!=0) { printf("Jesuislep`ere.\n"); wait(0); printf("mon fils a termi ´ \ "); ne. n } else { printf("je suis le fils.\n"); sleep(2); printf("arre^tdufils.\n"); exit(0); }
ssuesocprdevueremtneRoction
Recouvrement de processus Remplaceunautrecodelecodeex´ecuteparunprocessus. ´ Sutiliseeng´ene´ralapre`sun fork . Leprogrammeetlesdonne´esduprocessuschangent. Maisgardemeˆmepidetmˆemep`ere. M´ecanismelorsdelappeldunprogramme(ex, ls ) Terminal de commande fait un fork() . Processuscr´e´erecouvertparleprogramme ls . Leterminal(pe`re)attendlandesonls(appelsyst`eme wait() )
`tmesedxelpioatentiasebysnSroCo´S-naeJ
Soyez le premier à déposer un commentaire !

17/1000 caractères maximum.