А.В. Столяров - Введение в операционные системы (1114673), страница 20
Текст из файла (страница 20)
Òàáëèöà äåñêðèïòîðîâ ôàéëîâîãî ââîäà-âûâîäà, ñîäåðæàùàÿ ñâåäåíèÿ îá îòêðûòûõ ôàéëàõ è äðóãèõ ïîòîêàõ ââîäà-âûâîäà, äîñòóïíûõäàííîìó ïðîöåññó.5. Êîìàíäíàÿ ñòðîêà. Ñòðóêòóðà äàííûõ, ñîäåðæàùàÿ àðãóìåíòû êîìàíäíîé ñòðîêè, âêëþ÷àÿ èìÿ, ïî êîòîðîìó ïðîãðàììà áûëà âûçâàíà(ðèñ. 19, ñëåâà).88l s \0argvPATH=/bin:/usr/bin\0envirHOME=/home/john\0- l \0- a \0NULL/ u s r / l o c a l \0NULLTERM=xterm\0ls -l -a /usr/localÐèñ. 19: Ñòðóêòóðû äàííûõ êîìàíäíîé ñòðîêè è îêðóæåíèÿ6. Îêðóæåíèå. Ñòðóêòóðà äàííûõ, ñîäåðæàùàÿ èìåíà è çíà÷åíèÿ ïåðåìåííûõ îêðóæåíèÿ â âèäå òåêñòîâûõ ñòðîê (ðèñ. 19, ñïðàâà).7.
Òåêóùèé êàòàëîã. Êàæäûé ïðîöåññ íàõîäèòñÿ â îäíîì èç êàòàëîãîâôàéëîâîé ñèñòåìû; ýòîò ïàðàìåòð îïðåäåëÿåò, â êàêîì êàòàëîãå èñêàòüôàéëû, åñëè íå çàäàí ïîëíûé ïóòü.8. Êîðíåâîé êàòàëîã.  ÎÑ Unix ìîæíî îãðàíè÷èòü ôàéëîâóþ ñèñòåìó, âèäèìóþ ïðîöåññó è âñåì åãî ïîòîìêàì, ÷àñòüþ äåðåâà êàòàëîãîâ,èìåþùåé îáùèé êîðåíü.
Íàïðèìåð, åñëè óñòàíîâèòü ïðîöåññó êîðíåâîéêàòàëîã /foo, òî ïîä èìåíåì / ïðîöåññ áóäåò âèäåòü êàòàëîã /foo, à ïîäèìåíåì /bar − êàòàëîã /foo/bar. Êàòàëîãè çà ïðåäåëàìè /foo ïðîöåññó è âñåì åãî ïîòîìêàì âîîáùå íå áóäóò âèäíû íè ïîä êàêèìè èìåíàìè.Ýòî èñïîëüçóåòñÿ äëÿ çàïóñêà îòäåëüíûõ ïðîãðàìì â áåçîïàñíîì âàðèàíòå − òàê, ÷òîá îíè íå ìîãëè ïîëó÷èòü äîñòóï íè ê êàêèì ôàéëàìêðîìå òåõ, êîòîðûå ïðåäíàçíà÷åíû ñïåöèàëüíî äëÿ íèõ.9. Äèñïîçèöèÿ îáðàáîòêè ñèãíàëîâ.
Ñèãíàëû áóäóò ïîäðîáíî ðàññìîòðåíû íà ñëåäóþùåé ëåêöèè.10. Ïàðàìåòð umask. Ïðè ñîçäàíèè íîâûõ ôàéëîâ, êàòàëîãîâ è ò.ï. çíà÷åíèå ýòîãî ïàðàìåòðà ïîáèòîâî âû÷èòàåòñÿ èç çíà÷åíèÿ ïðàâà äîñòóïà,çàäàííîãî â ñèñòåìíîì âûçîâå. Íàïðèìåð, åñëè ïàðàìåòð umask ðàâåí0077, âñå ñîçäàâàåìûå ôàéëû áóäóò ïîëíîñòüþ íåäîñòóïíû äëÿ âñåõïîëüçîâàòåëåé, êðîìå âëàäåëüöà ôàéëà.11. Ñ÷åò÷èêè ïîòðåáëåííûõ ðåñóðñîâ (ïðîöåññîðíîãî âðåìåíè, ïàìÿòèè ò.ï.).12. Èíôîðìàöèÿ î âëàäåëüöå ïðîöåññà.
Ýòà èíôîðìàöèÿ âêëþ÷àåòuid (èäåíòèôèêàòîð ïîëüçîâàòåëÿ), gid (èäåíòèôèêàòîð ãðóïïû ïîëüçîâàòåëåé), euid è egid (ýôôåêòèâíûå èäåíòèôèêàòîðû ïîëüçîâàòåëÿ èãðóïïû).  áîëüøèíñòâå ñëó÷àåâ ýôôåêòèâíûå èäåíòèôèêàòîðû ñîâïàäàþò ñ îáû÷íûìè; ïðèìåðîì ñëó÷àÿ, êîãäà ýòî íå òàê, ÿâëÿþòñÿ òàê íàçûâàåìûå suid-ïðîãðàììû (òî åñòü ïðîãðàììû, âûïîëíÿåìûå ñ ïðàâàìè89ïîëüçîâàòåëÿ, âëàäåþùåãî èñïîëíÿåìûì ôàéëîì äàííîé ïðîãðàììû, àíå òîãî ïîëüçîâàòåëÿ, êîòîðûé ïðîãðàììó çàïóñòèë). Ê ÷èñëó òàêèõïðîãðàìì îòíîñèòñÿ passwd (ïðîãðàììà ñìåíû ïàðîëÿ).13. Èäåíòèôèêàòîðû ïðîöåññà, ðîäèòåëüñêîãî ïðîöåññà, ñåàíñà èãðóïïû ïðîöåññîâ. Ïàðàìåòð pid ïðåäñòàâëÿåò ñîáîé ÷èñëî − óíèêàëüíûé èäåíòèôèêàòîð ïðîöåññà â ñèñòåìå. Ïàðàìåòð ppid ðàâåí èäåíòèôèêàòîðó ðîäèòåëüñêîãî ïðîöåññà (ïðîöåññà, ïîðîäèâøåãî äàííûé),åñëè ýòîò ïðîöåññ åùå ñóùåñòâóåò; åñëè ðîäèòåëüñêèé ïðîöåññ çàâåðøàåòñÿ ðàíüøå äî÷åðíåãî, ppid äî÷åðíåãî ñòàíîâèòñÿ ðàâåí 1.
Ïîíÿòèÿñåàíñà è ãðóïïû ïðîöåññîâ áóäóò ðàññìîòðåíû â íàøåì êóðñå ïîçæå.14.214.2.1Óïðàâëåíèå ïðîöåññàìèÏîðîæäåíèå ïðîöåññàÅäèíñòâåííûé ñïîñîá ïîðîæäåíèÿ ïðîöåññà â ÎÑ Unix − ýòî ñîçäàíèåêîïèè ñóùåñòâóþùåãî ïðîöåññà3 . Äëÿ ýòîãî èñïîëüçóåòñÿ ñèñòåìíûé âûçîâint fork(void); ðåçóëüòàòå âûçîâà ñîçäàåòñÿ äî÷åðíèé ïðîöåññ, ÿâëÿþùèéñÿ òî÷íîé êîïèåéðîäèòåëüñêîãî, çà èñêëþ÷åíèåì ñëåäóþùèõ ðàçëè÷èé:1. Äî÷åðíèé ïðîöåññ èìååò ñâîé èäåíòèôèêàòîð (pid), åñòåñòâåííî, îòëè÷àþùèéñÿ îò èäåíòèôèêàòîðà ðîäèòåëÿ;2. Ïàðàìåòð ppid äî÷åðíåãî ïðîöåññà ðàâåí pid'ó ðîäèòåëüñêîãî ïðîöåññà;3. Ñ÷åò÷èêè ïîòðåáëåííûõ ðåñóðñîâ äî÷åðíåãî ïðîöåññà ñðàçó ïîñëåfork() ðàâíû íóëþ;4.
Âûïîëíåíèå îáîèõ ïðîöåññîâ (ðîäèòåëüñêîãî è äî÷åðíåãî) ïðîäîëæàåòñÿ ñ ïåðâîé èíñòðóêöèè, ñëåäóþùåé ñðàçó çà ôóíêöèåé fork() (îáû÷íîýòî ïðèñâàèâàíèå âîçâðàùàåìîãî åþ çíà÷åíèÿ êàêîé-ëèáî ïåðåìåííîé),ïðè÷åì â ðîäèòåëüñêîì ïðîöåññå fork() âîçâðàùàåò pid äî÷åðíåãî ïðîöåññà, à â äî÷åðíåì − ÷èñëî 0.Îòìåòèì, ÷òî ïîñëå âûçîâà fork() îáà ïðîöåññà (ðîäèòåëüñêèé è äî÷åðíèé) èñïîëüçóþò îäèí è òîò æå ñåãìåíò êîäà (ýòî âîçìîæíî, ò.ê. ñåãìåíò3 Íåêîòîðûåñèñòåìû ñåìåéñòâà Unix èìåþò àëüòåðíàòèâíûå âîçìîæíîñòè, òàêèå êàê clone() â ÎÑLinux, íî ýòè âîçìîæíîñòè ñïåöèôè÷íû äëÿ êàæäîé ñèñòåìû è èõ èñïîëüçîâàíèå íå ðåêîìåíäóåòñÿ90êîäà íå ìîæåò áûòü ìîäèôèöèðîâàí). ×òî êàñàåòñÿ îñòàëüíîé ïàìÿòè ïðîöåññà, òî îíà, çà èñêëþ÷åíèåì íåñêîëüêèõ ñïåöèàëüíûõ ñëó÷àåâ, êîïèðóåòñÿ4 .Ýòî îçíà÷àåò, â ÷àñòíîñòè, ÷òî â äî÷åðíåì ïðîöåññå ïðèñóòñòâóþò âñå ïåðåìåííûå, ñóùåñòâîâàâøèå â ðîäèòåëüñêîì ïðîöåññå, ïðè÷åì èçíà÷àëüíî îíèèìåþò òå æå çíà÷åíèÿ, íî èçìåíåíèÿ ïåðåìåííûõ â ðîäèòåëüñêîì ïðîöåññåíèêàê íå îòðàæàþòñÿ íà äî÷åðíåì, è íàîáîðîò.Êîïèðîâàíèþ ïîäâåðãàþòñÿ îòêðûòûå äåñêðèïòîðû ôàéëîâ, óñòàíîâëåííûå îáðàáîò÷èêè ñèãíàëîâ è ò.ï.14.2.2Çàìåíà âûïîëíÿåìîé ïðîãðàììûÇàïóñòèòü íà âûïîëíåíèå äðóãóþ ïðîãðàììó â ÎÑ Unix ìîæíî ïóòåì çàìåíû âûïîëíÿåìîé ïðîãðàììû â ðàìêàõ îäíîãî ïðîöåññà.
Ýòî äåéñòâèå îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ñèñòåìíîãî âûçîâà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).