Anda di halaman 1dari 7

Lucrarea 3

Procese i Fire de Execuie n Linux


Procese
Un proces reprezint un program n execuie. n UNIX, singurul
1
mod n care se pot crea
noi procese ni-l ofer apelul for. !intaxa acestuia este"
#include $s%s&t%pes.'(
#include $unistd.'(
pid)t for*+oid,-
n urma execuiei unui apel for se creeaz un nou proces, copie a procesului apelant,
numit copil, procesul apelant fiind printele. n cazul n care apelul a reu.it, for ntoarce
de dou ori. / dat n printe, ntorc0nd identificatorul copilului .i o dat n copil unde
ntoarce 1. 2ac n printe ntoarce 31 atunci n copil nu +a mai ntoarce nimic pe moti+
c apelul a e.uat, errno fiind setat corespunztor. 2iferenele ntre printe .i copil sunt"
4u 5I2 .i 55I2
6
diferite.
Nu sunt mo.tenite 7locrile asupra fi.ierelor .i semnalele n a.teptare.
Nu parta8eaz zona de date
9
ci doar zona de cod
:
*plus alte informaii dependente
de implementare,.
2ac un copil .i termin execuia fr ca printele s-l ;rezol+e; el de+ine un ;zom7ie;,
adic un proces care nu +a mai fi planificat pentru execuie dar ale crui resurse nu sunt
eli7erate. 5entru a eli7era resursele unui copil, printele tre7uie s apeleze o funcie <ait.
=ea mai simpl +ariant are sintaxa"
#include $s%s&t%pes.'(
#include $s%s&<ait.'(
pid)t <ait*int >status,-
1
n ?inux ;singurul; se +a citi ;un;.
6
5rocess I2entifier .i 5rocess 5arent I2entifier, identificatorul de proces .i identificatorul de proces al
printelui.
9
Nu parta8eaz zona de date cu ade+rat, c'iar dac for este implementat n ?inux folosind paginarea cu
cop%-on-<rite.
:
2e fapt asta-i o asemnare.
4ceast funcie suspend execuia procesului curent p0n c0nd un copil a terminat
execuia sau p0n c0nd se prime.te un semnal a crui semnificaie este terminarea
procesului curent sau apelarea unei funcii de tratare a semnalului. 2ac un copil .i-a
terminat execuia n momentul apelului funcia +a ntoarce imediat. 2ac status nu este
NU?? atunci funcia +a pune informaia despre starea copilului n locaia indicat de
status. n caz de succes funcia +a ntoarce identificatorul copilului sau 31 n caz de
eroare.
Urmtorul exemplu creeaz un proces copil"
#include @stdio.'A
#include @s%s&t%pes.'A
int main*,B
pid)t cpid-
if *cpid C for*,,B
printf*@IDm t'e parent EnA,-
<ait*NU??,-
F else B
printf*@='ild speaing EnA,-
F
return 1-
F
2ac dorii s a.teptai dup un anumit copil, putei folosi funcia"
pid)t <aitpid*pid)t pid, int >status, int options,-
5arametrul pid poate a+ea una din +alorile"
$ -1 ceea ce nseamn c se a.teapt dup oricare copil al crui I2 de grup este
egal cu +aloarea a7solut a pid.
-1 se a.teapt dup oricare copil.
-1 ceea ce nseamn c se a.teapt oricare copil al crui I2 de grup este egal
cu cel al procesului apelant.
(1 se a.teapt acel copil al crui I2 de proces este egal cu parametrul.
=u a8utorul opiunilor se poate specifica s nu se a.tepte dac nici un copil nu .i-a
terminat execuia *GN/H4NI, .i&sau s ntoarc .i pentru copiii care s-au oprit dar care
nu au raportat starea de ie.ire. /piunile se pot com7ina cu a8utorul /J.
2ac status nu este NU?? el poate fi e+aluat cu a8utorul urmtoarelor macrouri *care
primesc un int ca parametru,"
GIKLXIML2*status, ntoarce true dac copilul .i-a terminat execuia n
mod normal, adic apel0nd exit*,, )exit*, sau cu return din main.
GLXIM!M4MU!*status, ntoarce cei mai puin semnificati+i N 7ii ai
copilului care au fost setai ca argument al apelului exit*,, )exit*, sau return. 4cest macro
nu poate fi e+aluat dec0t dac GIKLXIML2 a ntors true.
GIK!IIN4?L2*status, ntoarce true dac copilul .i-a terminat execuia
datorit unui semnal necaptat.
GMLJO!II*status, ntoarce numrul semnalului care l-a fcut pe copil
s-.i termine execuia. Lste ne+oie ca macroul de mai sus s ntoarc true.
GIK!M/55L2*status, ne spune dac copilul a fost stopat. 4pelul <aitpid
tre7uie s ai7 opiunea GUNMJ4=L2 setat.
G!M/5!II*status, ntoarce numrul semnalului care a oprit copilul.
Kire.te c depinde de ce ntoarce GIK!M/55L2.
2ac dorii s lansai un alt program .i nu o copie a printelui, n copil putei apela una
din funciile exec care au ca efect suprascrierea procesului apelant"
#include $unistd.'(
int execl*const c'ar >pat', const c'ar >arg, ...,-
int execlp*const c'ar >file, const c'ar >arg, ...,-
int execle*const c'ar >pat', const c'ar >arg , ..., c'ar > const en+pPQ,-
int exec+*const c'ar >pat', c'ar >const arg+PQ,-
int exec+p*const c'ar >file, c'ar >const arg+PQ,-
Kunciile care nu au sufixul p *de la 54MH, au ca prim argument numele complet
specificat *cu tot cu cale, al fi.ierului. 2ac folosii o funcie care are sufixul p .i fi.ierul
nu conine nici un RER atunci funcia +a duplica funcia de cutare a interpretorului de
comenzi.
5arametrii arg .i arg+ sunt parametrii transmi.i, fie ca list fie ca +ector. 5rin con+enie,
primul argument ar tre7ui s indice spre numele fi.ierului. Ultimul argument tre7uie s
fie NU??.
5arametrul en+p este un +ector conin0nd lista cu +aria7ilele de mediu, pe ultima poziie
fiind NU??.
Kuncia ntoarce numai n cazul unei erori, set0nd .i +aria7ila errno.
Fire de Execuie
4tunci c0nd lansai un proces ;o7i.nuit; n execuie instruciunile acestuia se execut
sec+enial, pe un singur ;fir; de execuie. 2in moti+e pe care o s aflai&poate le-ai aflat
la curs
S
, uneori este renta7il ca n cadrul unui proces s fie executate c+asi-paralel mai
multe fire de execuie. 5entru a crea un fir de execuie folosii"
#include $pt'read.'(
int pt'read)create* pt'read)t > t'read,
pt'read)attr)t > attr,
+oid > *>start)routine,*+oid >,,
+oid > arg,-
Noul fir de execuie se execut concurent cu firul apelant. 5arametrii apelului au
urmtoarea semnificaie"
pt'read)t > t'read - n caz de succes, identificatorul noului fir creat este
memorat n locaia spre care indic acest pointer.
pt'read)attr)t > attr - specific atri7utele care +or fi aplicate noului fir. n cazul
n care acest argument este NU?? se folosesc atri7utele implicite" firul este
;8oina7le; .i are planificat folosind politica implicit.
+oid > *>start)routine,*+oid >, - aceasta este funcia lansat de apel.
+oid >arg - reprezint argumentul pe care l prime.te funcia lansat.
n caz de reu.it, apelul ntoarce 1. 4tunci c0nd un fir care a fost creat cu atri7utul
;8oina7le; .i termin execuia, resursele sale de memorie nu sunt eli7erate p0n c0nd un
alt fir nu l ;a.teapt; folosind apelul
T
"
#include $pt'read.'(
int pt'read)8oin*pt'read)t t', +oid >>t'read)return,-
n urma acestui apel, firul apelant .i suspend execuia p0n c0nd firul idendificat de th
.i termin execuia. 2ac cel de-al doilea argument este diferit de NU??, +aloarea
ntoars de firul th prin un apel pt'read)exit este memorat n locaia indicat de acesta
U
.
Un fir nu poate fi a.teptat dec0t de un singur fir.
n caz de succes, apelul ntoarce 1.
Lxemplu de creare a unui fir"
//compilare folosind biblioteca pthread
//gcc -pthread
S
!au din cri ;if %ou sip classes;.
T
4cest apel poate fi folosit numai pentru firele create cu acest atri7ut.
U
5MHJL42)=4N=L?L2 indic faptul ca firul a fost oprit.
#include <pthread.h>
void *fir(void* arg){
printf("pornit fir secundar nr d!n"" * (int*) arg)#
$
int main(){
pthread%t th#
printf("pornit fir principal!n")#
int i & '#
int ret & pthread%create((th" )*++" fir" (i)#
if(ret){
printf("eroare!n")#
$
pthread%,oin(th" )*++)#
printf("terminat fir principal!n")#
return '#
$
5rincipala diferen ntre fire .i procese const n modul de parta8are a spaiului de date.
5entru a +edea care sunt aceste diferene rulai urmtoarele dou exemple"
//gcc -pthread th.c
#include <pthread.h>
int -#
void *fir(void* arg){
printf("pornit fir secundar nr d!n"" * (int*) arg)#
printf(".nainte de asignarea din sec" in firul secundar - & d !n""
-)#
- & /#
$
int main(){
pthread%t th#
- & '#
printf("pornit fir principal!n")#
int i & '#
int ret & pthread%create((th" )*++" fir" (i)#
if(ret){
printf("eroare!n")#
$
pthread%,oin(th" )*++)#
printf("0upa asignarea din sec" in firul principal - & d !n"" -)#
printf("terminat fir principal!n")#
return '#
$
1i2
#include "stdio.h"
#include "s3s/t3pes.h"
int 3 & '#
int main(){
int - & /#
pid%t cpid#
if (cpid & for4()){
printf(". am the parent!n")#
5ait()*++)#
printf(". am the parent" variables after children assigment - & d"
3 & d !n"" -" 3)#
$ else {
printf(". am the child" variables before m3 assigment - & d" 3 &
d !n"" -" 3)#
- & 6#
3 & 7#
printf(". am the child" variables after m3 assigment - & d" 3 & d
!n"" -" 3)#
$

return 8#
$
Alte funcii i comenzi utile.
ps && raporteaz procesele curente.
top && raporteaz tas-urile ?inux.
ill && transmite un semnal unui anumit proces.
fg && aduce un 8o7
N
n prim-plan, fc0ndu-l curent
V
.
7g && trimite un 8o7 n fundal.
cloc)t cloc*+oid,-&& ntoarce o aproximare a timpului procesor folosit de program.
+oid exit*int status,-&& 5ro+oac terminarea normal a programului.
pid)t getpid*+oid,-&&ntoarce identificatorul procesului curent.
pid)t getppid*+oid,-&&ntoarce identificatorul printelui procesului curent.
+oid pt'read)exit*+oid >ret+al,-&&Mermin execuia firului apelant.
int s%stem*const c'ar >string,- &&Lxecut o comand.
unsigned int sleep*unsigned int seconds,-&&;4doarme; procesul curent pentru un numr
de secunde.
time)t time*time)t >t,-&& ntoarce numrul de secunde care au trecut de la ora 11"11"11
UM=, 1 ianuarie, 1VU1.
11
N
Un 8o7 reprezint un ansam7lu de procese cu acela.i identificator de grup. 5ot fi mai multe procese
conectate printr-o conduct.
V
2ac dorii s lansai un proces n fundal lansai-l cu sufixul W. Lxemplu"
comandaW
11
4lte funcii legate de timp"
c'ar >asctime*const struct tm >tm,-
c'ar >asctime)r*const struct tm >tm, c'ar >7uf,-
c'ar >ctime*const time)t >timep,-
c'ar >ctime)r*const time)t >timep, c'ar >7uf,-
struct tm >gmtime*const time)t >timep,-
Probleme propuse.
1. ! se adune elementele unui +ector folosind N procesoare.
6. ! se scrie un mic program de testare online, care n afar de afi.area ntre7rii .i
citirea rspunsului s afi.eze din minut n minut timpul rmas. 2up terminarea
sesiunii de examinare, prin epuizarea ntre7rilor sau prin expirarea timpului, s
se re+in n starea de nceput, c0nd, nainte de start, se introduce numele
candidatului. ! se implementeze folosind procese.
9. ! se scrie un mic program de testare online, care n afar de afi.area ntre7rii .i
citirea rspunsului s afi.eze din minut n minut timpul rmas. 2up terminarea
sesiunii de examinare, prin epuizarea ntre7rilor sau prin expirarea timpului, s
se re+in n starea de nceput, c0nd, nainte de start, se introduce numele
candidatului. ! se implementeze folosind fire de execuie.
:. ! se scrie un minis'ell.
struct tm >gmtime)r*const time)t >timep, struct tm >result,-
struct tm >localtime*const time)t >timep,-
struct tm >localtime)r*const time)t >timep, struct tm >result,-
time)t mtime*struct tm >tm,-

Anda mungkin juga menyukai