А.В. Столяров - Введение в операционные системы (1152218), страница 21
Текст из файла (страница 21)
Ýòî äåéñòâèå îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ñèñòåìíîãî âûçîâàint execve(const char *path, char* const argv[],char* const envir[]);Ïàðàìåòð path çàäàåò èñïîëíÿåìûé ôàéë ïðîãðàììû, êîòîðóþ íåîáõîäèìîçàïóñòèòü íà âûïîëíåíèå âìåñòî òåêóùåé (ôàéë ìîæíî çàäàòü êàê ïîëíûìïóòåì, òàê è îòíîñèòåëüíî òåêóùåãî êàòàëîãà). Ïàðàìåòðû argv è envir çàäàþò, ñîîòâåòñòâåííî, êîìàíäíóþ ñòðîêó è îêðóæåíèå äëÿ çàïóñêàåìîé ïðîãðàììû â âèäå àäðåñîâ ñòðóêòóð äàííûõ, ïîêàçàííûõ íà ðèñ. 19 (ñì. ñòð. 89).Äëÿ óäîáñòâà ïðîãðàììèðîâàíèÿ ñóùåñòâóþò åùå íåñêîëüêî ôóíêöèé ñåìåéñòâà exec, ðåàëèçîâàííûõ â áèáëèîòåêå ÷åðåç âûçîâ execve().
Íà÷íåì ñôóíêöèèint execv(const char *path, char* const argv[]);Îò âûçîâà execve(), êàê ìîæíî çàìåòèòü, ýòà ôóíêöèÿ îòëè÷àåòñÿ îòñóòñòâèåì ïàðàìåòðà envir. Îêðóæåíèå äëÿ çàïóñêàåìîé ïðîãðàììû â ýòîì ñëó÷àåáåðåòñÿ â òî÷íîñòè òî æå, êîòîðîå èìåëî ìåñòî ó òåêóùåé ïðîãðàììû, òî åñòüîêðóæåíèå, ïîïðîñòó ãîâîðÿ, íàñëåäóåòñÿ.Ñëåäóþùàÿ ïîëåçíàÿ ôóíêöèÿ èìååò òî÷íî òàêîé æå ïðîòîòèï, êàê èïðåäûäóùàÿ:int execvp(const char *path, char* const argv[]);4Âñîâðåìåííûõ ñèñòåìàõ îáû÷íî ïðîöåññû ïðîäîëæàþò ðàçäåëÿòü ñòðàíèöû ïàìÿòè äî òåõ ïîð, ïîêà îäèí èç íèõ íå ïîïûòàåòñÿ òó èëè èíóþ ñòðàíèöó ìîäèôèöèðîâàòü: â ýòîì ñëó÷àå ñîçäàåòñÿ êîïèÿñòðàíèöû91Îòëè÷èå execvp() îò execv() ñîñòîèò â òîì, ÷òî èìÿ, çàäàííîå â ïàðàìåòðåpath, ìîæåò áûòü èìåíåì ïðîãðàììû, èñïîëíÿåìûé ôàéë êîòîðîé íàõîäèòñÿâ îäíîé èç äèðåêòîðèé, ïåðå÷èñëåííûõ â ïåðåìåííîé îêðóæåíèÿ PATH; òàê,åñëè ïåðåìåííàÿ PATH âêëþ÷àåò äèðåêòîðèþ /bin, òî âûçâàòü ïðîãðàììó lsìîæíî ïðîñòî ïî èìåíè, íå óêàçûâàÿ ïîëíûé ïóòü.Íàêîíåö, áûâàþò ñëó÷àè, êîãäà óæå íà ýòàïå íàïèñàíèÿ èñõîäíîé ïðîãðàììû íàì èçâåñòíî òî÷íîå êîëè÷åñòâî ïàðàìåòðîâ êîìàíäíîé ñòðîêè äëÿ çàïóñêàåìîé ïðîãðàììû.
 ýòîì ñëó÷àå íåò íåîáõîäèìîñòè ôîðìèðîâàòü ñòðóêòóðó äàííûõ, òðåáóþùóþñÿ äëÿ ðàññìîòðåííûõ ôóíêöèé. Âìåñòî ýòîãî ìîæíîèñïîëüçîâàòü îäíó èç äâóõ ôóíêöèéint execl(const char *path, const char *argv0, ...);int execlp(const char *path, const char *argv0, ...);Ýòè ôóíêöèè ïîëó÷àþò ïðîèçâîëüíîå ÷èñëî àðãóìåíòîâ, ïåðâûé èç êîòîðûõçàäàåò èñïîëíÿåìûé ôàéë, îñòàëüíûå − àðãóìåíòû êîìàíäíîé ñòðîêè. ×òîáûôóíêöèÿ çíàëà, ãäå îñòàíîâèòüñÿ, ïîñëå ïîñëåäíåãî ñëîâà êîìàíäíîé ñòîêèñëåäóåò äîáàâèòü åùå îäèí ïàðàìåòð ñî çíà÷åíèåì NULL. Ñëåäóåò îáðàòèòüâíèìàíèå, ÷òî êîìàíäíàÿ ñòðîêà âêëþ÷àåò íóëåâîé ýëåìåíò, ïîä êîòîðûìïîäðàçóìåâàåòñÿ èìÿ ñàìîé ïðîãðàììû; òàêèì îáðàçîì, àðãóìåíò argv0 −ýòî íå ïåðâûé àðãóìåíò êîìàíäíîé ñòðîêè, à íå÷òî èìåþùåå îòíîøåíèå êèìåíè ïðîãðàììû, â áîëüøèíñòâå ñëó÷àåâ çíà÷åíèå argv0 ïîïðîñòó ñîâïàäàåòñ path.Ðàçëè÷èå ìåæäó execl() è execlp() â òîì, ÷òî ïåðâàÿ òðåáóåò óêàçàíèÿÿâíîãî ïóòè ê èñïîëíÿåìîìó ôàéëó, òîãäà êàê âòîðàÿ âûïîëíÿåò ïîèñê ïîïåðåìåííîé PATH, ïîäîáíî òîìó, êàê ýòî äåëàåò execvp().Äîïóñòèì, òðåáóåòñÿ âûïîëíèòü êîìàíäó ls -l -a /var.
Ýòî ìîæíî ñäåëàòü, íàïðèìåð, òàê:char *argv[] = { "ls", "-l", "-a", "/var", NULL };execvp("ls", argv);ëèáî òàê:execlp("ls", "ls", "-l", "-a", "/var", NULL);Ïîâòîðèì, ÷òî âñå ôóíêöèè ñåìåéñòâà exec çàìåíÿþò â ïàìÿòè ïðîöåññàâûïîëíÿâøóþñÿ (è âûçâàâøóþ exec) ïðîãðàììó íà äðóãóþ, óêàçàííóþ â ïàðàìåòðàõ âûçîâà. Ïîýòîìó â ñëó÷àå óñïåõà ôóíêöèè exec óïðàâëåíèå óæå íåâîçâðàùàþò (â ñàìîì äåëå, ïðîãðàììû, â êîòîðóþ ìîæíî áûëî áû âåðíóòüóïðàâëåíèå, â ýòîì ñëó÷àå óæå íåò; âìåñòî íåå ðàáîòàåò íîâàÿ ïðîãðàììà). Âñëó÷àå îøèáêè âîçâðàùàåòñÿ çíà÷åíèå -1, íî ïðîâåðÿòü åãî íå îáÿçàòåëüíî:ñàì ôàêò âîçâðàòà óïðàâëåíèÿ ñâèäåòåëüñòâóåò î ïðîèñøåäøåé îøèáêå.92Îòìåòèì, ÷òî îòêðûòûå ôàéëîâûå äåñêðèïòîðû ïðè âûïîëíåíèè execîñòàþòñÿ îòêðûòûìè5 , ÷òî ïîçâîëÿåò ïåðåä çàïóñêîì íà âûïîëíåíèå âíåøíåé ïðîãðàììû ïðîèçâåñòè ìàíèïóëÿöèè ñ äåñêðèïòîðàìè.
Ýòî ñâîéñòâî execèñïîëüçóåòñÿ äëÿ ïåðåíàïðàâëåíèÿ ââîäà-âûâîäà.14.2.3Çàâåðøåíèå ïðîöåññàÄëÿ çàâåðøåíèÿ ïðîöåññà èñïîëüçóåòñÿ âûçîâvoid exit(int code);Ïàðàìåòð code çàäàåò êîä çàâåðøåíèÿ ïðîöåññà. Ñ÷èòàåòñÿ, ÷òî çíà÷åíèå 0îçíà÷àåò óñïåøíîå çàâåðøåíèå, çíà÷åíèÿ 1, 2, 3 è ò.ä. − ÷òî ïðîèçîøëà òà èëèèíàÿ îøèáêà èëè íåóäà÷à.
Îáû÷íî èñïîëüçóþòñÿ çíà÷åíèÿ, íå ïðåâûøàþùèå10, õîòÿ ýòî íå îáÿçàòåëüíî.Ïðîöåññ òàêæå çàâåðøàåòñÿ, åñëè çàêàí÷èâàåò èñïîëíÿòüñÿ åãî ôóíêöèÿmain().  ýòîì ñëó÷àå â êà÷åñòâå êîäà çàâåðøåíèÿ áåðåòñÿ çíà÷åíèå, âîçâðàùåííîå èç ôóíêöèè main() (ýòî ÿâëÿåòñÿ ïðè÷èíîé òîãî, ÷òî â Unix'åôóíêöèÿ main() îáÿçàòåëüíî èìååò òèï âîçâðàùàåìîãî çíà÷åíèÿ int).Çàáåãàÿ âïåðåä, îòìåòèì, ÷òî ïðîöåññ òàêæå ìîæåò áûòü óíè÷òîæåí ñèãíàëîì èçâíå; â ýòîì ñëó÷àå êîäà çàâåðøåíèÿ ó íåãî íå áóäåò.14.2.4Ïðîöåññû-çîìáè è èõ îáðàáîòêàÏîñëå çàâåðøåíèÿ ïðîöåññà â ñèñòåìå îñòàåòñÿ èíôîðìàöèÿ î òîì, ïðèêàêèõ îáñòîÿòåëüñòâàõ çàâåðøèëñÿ ïðîöåññ (ñàì ëè îí çàâåðøèëñÿ, åñëè äà −òî ñ êàêèì êîäîì çàâåðøåíèÿ, åñëè íåò − òî êàêèì ñèãíàëîì îí óíè÷òîæåí)è çíà÷åíèÿ ñ÷åò÷èêîâ ïîòðåáëåííûõ ðåñóðñîâ.
Ýòó èíôîðìàöèþ äîëæåí çàòðåáîâàòü ðîäèòåëüñêèé ïðîöåññ6 . Äî òåõ ïîð, ïîêà ñîîòâåòñòâóþùàÿ èíôîðìàöèÿ íå áóäåò çàòðåáîâàíà ðîäèòåëüñêèì ïðîöåññîì, çàâåðøåííûé ïðîöåññïðîäîëæàåò ñóùåñòâîâàòü â ñèñòåìå â âèäå ïðîöåññà-çîìáè, òî åñòü çàíèìàåò ìåñòî â òàáëèöå ïðîöåññîâ, ïðè ýòîì íå èìåÿ êîäà, äàííûõ è ò.ï., à òîëüêîèäåíòèôèêàòîð, ñ÷åò÷èêè ðåñóðñîâ è ñòàòóñ çàâåðøåíèÿ.Çàòðåáîâàòü èíôîðìàöèþ (è óáðàòü çîìáè-ïðîöåññ èç ñèñòåìû) ïîçâîëÿþò ñèñòåìíûå âûçîâû ñåìåéñòâà wait(). Ïðîñòåéøèé èç íèõ èìååò ñëåäóþùèé ïðîòîòèï:int wait(int *status);5Âïðèíöèïå, ìîæíî çàñòàâèòü ñèñòåìó çàêðûòü íåêîòîðûå äåñêðèïòîðû ïðè âûïîëíåíèè exec, óñòàíîâèâ íà ýòè äåñêðèïòîðû ôëàã close-on-exec ñ ïîìîùüþ âûçîâà fcntl(), íî òàê äåëàþò ðåäêî6 Åñëè ðîäèòåëüñêèé ïðîöåññ çàâåðøàåòñÿ ðàíüøå äî÷åðíåãî, ôóíêöèè ðîäèòåëüñêîãî áåðåò íà ñåáÿïðîöåññ init (ïðîöåññ íîìåð 1)93 ñëó÷àå, åñëè íè îäíîãî äî÷åðíåãî ïðîöåññà íåò, âûçîâ âîçâðàùàåò êîä îøèáêè (çíà÷åíèå -1).
 ñëó÷àå, åñëè äî÷åðíèå ïðîöåññû åñòü, íî íè îäèí èç íèõåùå íå çàâåðøèëñÿ (òî åñòü íåò íè îäíîãî çîìáè, êîòîðîãî ìîæíî ñíÿòü),âûçîâ æäåò çàâåðøåíèÿ ëþáîãî èç äî÷åðíèõ ïðîöåññîâ (îòñþäà íàçâàíèå âûçîâà − wait, àíãë. æäàòü ). ñëó÷àå óñïåõà âûçîâ âîçâðàùàåò pid çàâåðøèâøåãîñÿ ïðîöåññà. Åñëèïàðàìåòð ïðåäñòàâëÿë ñîáîé íåíóëåâîé óêàçàòåëü, â öåëî÷èñëåííóþ ïåðåìåííóþ, íà êîòîðóþ îí óêàçûâàë, çàïèñûâàåòñÿ èíôîðìàöèÿ î êîäå çàâåðøåíèÿ ïðîöåññà èëè î íîìåðå ñèãíàëà, ïî êîòîðîìó ïðîöåññ áûë ñíÿò. Äëÿàíàëèçà èíôîðìàöèè â ýòîé ïåðåìåííîé èñïîëüçóþòñÿ ìàêðîñû WIFEXITED,WIFSIGNALED (áûë ëè ïðîöåññ çàâåðøåí îáû÷íûì ñïîñîáîì èëè ïî ñèãíàëó),WEXITSTATUS (åñëè çàâåðøåí îáû÷íûì îáðàçîì, òî êàêîâ êîä çàâåðøåíèÿ),WTERMSIG (åñëè ïî ñèãíàëó, òî êàêîâ íîìåð ñèãíàëà).Áîëåå ãèáêèì ÿâëÿåòñÿ âûçîâint wait4(int pid, int *status, int options,struct rusage *rusage); êà÷åñòâå ïåðâîãî ïàðàìåòðà ìîæíî óêàçàòü èäåíòèôèêàòîð êîíêðåòíîãîïðîöåññà, ëèáî -1, åñëè òðåáóåòñÿ äîæäàòüñÿ ëþáîãî äî÷åðíåãî ïðîöåññà; èìååòñÿ òàêæå âîçìîæíîñòü äîæäàòüñÿ ïðîöåññà èç îïðåäåëåííîé ãðóïïû ïðîöåññîâ.
Ïàðàìåòð status èñïîëüçóåòñÿ òàê æå, êàê äëÿ ïðåäûäóùåãî âûçîâà. Âêà÷åñòâå çíà÷åíèÿ options ìîæíî óêàçàòü ÷èñëî 0, ëèáî êîíñòàíòó WNOHANG. ýòîì ñëó÷àå âûçîâ íå æäåò çàâåðøåíèÿ ïðîöåññîâ; åñëè íè îäíîãî ïîäõîäÿùåãî çîìáè íåò, âûçîâ íåìåäëåííî âîçâðàùàåò çíà÷åíèå 0.
Åñëè óêàçàòåëü rusage íåíóëåâîé, â óêàçóåìóþ îáëàñòü ïàìÿòè çàïèñûâàþòñÿ çíà÷åíèÿñ÷åò÷èêîâ ðåñóðñîâ çàâåðøèâøåãîñÿ ïðîöåññà. Âûçîâ âîçâðàùàåò -1 â ñëó÷àåîøèáêè, 0 â ñëó÷àå, åñëè èñïîëüçîâàëàñü îïöèÿ WNOHANG è çàâåðøèâøèõñÿïðîöåññîâ íå áûëî, è pid çàâåðøèâøåãîñÿ ïðîöåññà, åñëè âûçîâ óñïåøíî ïîëó÷èë èíôîðìàöèþ èç çîìáè.14.2.5ÏðèìåðÏðèâåäåì ïðèìåð çàïóñêà âíåøíåé ïðîãðàììû ñ ïîìîùüþ ñâÿçêèfork()+exec().int pid;pid = fork();if(pid == -1) { /* îøèáêà */perror("fork");exit(1);94}if(pid == 0) { /* äî÷åðíèé ïðîöåññ */execlp("ls", "ls", "-l", "-a", "/var", NULL);perror("ls"); /* exec âåðíóë óïðàâëåíèå -> îøèáêà */exit(1); /* çàâåðøàåì ïðîöåññ ñ íåóñïåøíûì êîäîì */}/* ðîäèòåëüñêèé ïðîöåññ */wait(NULL); /* äîæäàåìñÿ îêîí÷àíèÿ äî÷åðíåãî ïðîöåññà,çàîäíî óáèðàåì çîìáè */14.3Æèçíåííûé öèêë ïðîöåññàблокировка(откачан)готовность(откачан)блокировкасозданиеготовностьядропольз.
режимпрерываниепланировщиквыполнениев режиме ядравыйзовынемстисгопроенммарепрzombieерратвозввыполнениеÐèñ. 20: Æèçíåííûé öèêë ïðîöåññàÑ ó÷åòîì âîçìîæíîñòè îòêà÷êè íåîáõîäèìûõ ïðîöåññó äàííûõ èç ïàìÿòèíà âíåøíèå óñòðîéñòâà, æèçíåííûé öèêë ïðîöåññà ïðèíèìàåò âèä, ïîêàçàííûé íà ðèñ.
20. Íà ñõåìå âèäíî, ÷òî ïðîöåññ ìîæåò áûòü ñîçäàí êàê ãîòîâûìê èñïîëíåíèþ (åñëè â ñèñòåìå áûëî äîñòàòî÷íî äëÿ ýòîãî ñâîáîäíîé îïåðàòèâíîé ïàìÿòè), òàê è ñðàçó îòêà÷àííûì, åñëè ïàìÿòè íå õâàòèëî. Ñèñòåìàïî ñâîåìó óñìîòðåíèþ ìîæåò îòêà÷èâàòü è ïîäêà÷èâàòü îáðàòíî ïàìÿòü ãîòîâûõ ê âûïîëíåíèþ ïðîöåññîâ (êàê îòäåëüíûå ñòðàíèöû, òàê è ïðîöåññûöåëèêîì).95Ïðè çàïóñêå ïðîöåññà íà âûïîëíåíèå ÿäðî ñíà÷àëà âûïîëíÿåò íåêîòîðóþïîäãîòîâèòåëüíóþ ðàáîòó; âìåñòå ñ îáðàáîòêîé ñèñòåìíûõ âûçîâîâ è ïðîãðàììíûõ ïðåðûâàíèé ýòî ñîñòàâëÿåò âûïîëíåíèå â ðåæèìå ÿäðà. Âàæíîïîíèìàòü, ÷òî â ðåæèìå ÿäðà âûïîëíÿþòñÿ òîëüêî èíñòðóêöèè ÿäðà, íèêàêèå÷àñòè êîäà ïðîöåññà â ðåæèìå ÿäðà íèêîãäà íå èñïîëíÿþòñÿ. Íà ñàìîì äåëå,â ðåæèìå ÿäðà ðàáîòàåò, êàê ìû âèäèì, ñàìî ÿäðî.