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,-