А.В. Столяров - Введение в операционные системы (1114673), страница 31
Текст из файла (страница 31)
Òàê, åñëè ïîëüçîâàòåëüñêàÿ ñåññèÿ ðàáîòû ñ òåðìèíàëîì ïî òîéèëè èíîé ïðè÷èíå çàâåðøèëàñü (íàïðèìåð, ïîëüçîâàòåëü âûêëþ÷èë òåðìèíàë, ðàçîðâàë ñîåäèíåíèå óäàëåííîãî äîñòóïà èëè çàêðûë îêíî ïðîãðàììûxterm), òî âñåì ïðîöåññàì ñåàíñà, ñâÿçàííîãî ñ äàííûì òåðìèíàëîì, ðàññûëàåòñÿ ñèãíàë SIGHUP.×òî êàñàåòñÿ ãðóïï, òî îíè, íàïðèìåð, èñïîëüçóþòñÿ ïðè ðàññûëêå ñèãíàëà SIGINT ïî íàæàòèþ Ctrl-C: ñèãíàë ïîëó÷àþò òîëüêî ïðîöåññû îñíîâíîéãðóïïû, à ôîíîâûå ïðîäîëæàþò ðàáîòó.Áîëåå òîãî, ñàì ïî ñåáå ââîä ñ òåðìèíàëà ðàçðåøåí òîëüêî ïðîöåññàì îñíîâíîé ãðóïïû.
Ôîíîâûé ïðîöåññ ïðè ïîïûòêå ÷òåíèÿ ñ òåðìèíàëà ïðèîñòàíàâëèâàåòñÿ ñèãíàëîì SIGTTIN.Âîîáùå, ìåõàíèçì ñåàíñîâ è ãðóïï ñîçäàí â îñíîâíîì äëÿ òîãî, ÷òîáû ìîæíî áûëî óñòàíîâèòü, êàêèõ ïðîöåññîâ íåïîñðåäñòâåííî êàñàþòñÿ äåéñòâèÿ,âûïîëíÿåìûå ïîëüçîâàòåëåì ñ òåðìèíàëîì. ðàìêàõ îäíîãî è òîãî æå ñåàíñà ïðîöåññ ìîæåò ïåðåéòè â äðóãóþ ãðóïïó. Ëþáàÿ èç ãðóïï ìîæåò áûòü â ëþáîé ìîìåíò íàçíà÷åíà îñíîâíîé, òîãäàáûâøàÿ îñíîâíàÿ ñòàíîâèòñÿ ôîíîâîé.25.2Óïðàâëåíèå ñåàíñàìè è ãðóïïàìèÐàññìîòðèì êðàòêî ñèñòåìíûå âûçîâû è ôóíêöèè, èìåþùèå îòíîøåíèåê óïðàâëåíèþ ñåàíñàìè è ãðóïïàìè.
Óçíàòü äëÿ ïðîöåññà ïàðàìåòðû sid èpgid ìîæíî ñ ïîìîùüþ âûçîâîâint getsid(int pid);int getpgid(int pid);ãäå pid − èäåíòèôèêàòîð èíòåðåñóþùåãî íàñ ïðîöåññà. Ñïåöèàëüíîå çíà÷åíèå 0 îçíà÷àåò âûçûâàþùèé ïðîöåññ. Îòìåòèì, ÷òî èäåíòèôèêàòîð ñåàíñàñîâïàäàåò ñ èäåíòèôèêàòîðîì (pid) ïðîöåññà, ñîçäàâøåãî ýòîò ñåàíñ; îáû÷íîèäåíòèôèêàòîð ãðóïïû òàêæå ñîâïàäàåò ñ pid'îì ñîçäàâøåãî ãðóïïó ïðîöåññà. Ñîîòâåòñòâóþùèå ïðîöåññû íàçûâàþòñÿ ëèäåðàìè, ñîîòâåòñòâåííî, ñåàíñàè ãðóïïû.Ñîçäàíèå íîâîãî ñåàíñà ïðîèçâîäèòñÿ âûçîâîì142int setsid();Âûçîâ íå ïðîõîäèò â ñëó÷àå, åñëè äàííûé ïðîöåññ óæå ÿâëÿåòñÿ ëèäåðîìñåàíñà èëè õîòÿ áû ãðóïïû.
×òîáû ãàðàíòèðîâàòü óñïåøíîå ñîçäàíèå ñåàíñà,ñëåäóåò ñäåëàòü fork() è çàâåðøèòü ðîäèòåëüñêèé ïðîöåññ, ñìåíèâ, òàêèìîáðàçîì, ñâîé pid:if(fork()>0) exit(0);setsid();Ïðè óñïåøíîì âûïîëíåíèè setsid() áóäóò ñîçäàíû îäíîâðåìåííî íîâûé ñåàíñ è íîâàÿ ãðóïïà, èäåíòèôèêàòîðû êîòîðûõ áóäóò ñîâïàäàòü ñ pid'îì ïðîöåññà, âûïîëíèâøåãî setsid(), ïðè÷åì âûçâàâøèé ïðîöåññ îêàæåòñÿ åäèíñòâåííûì ÷ëåíîì è òîãî, è äðóãîãî.Êàê óæå ãîâîðèëîñü, êàæäûé òåðìèíàë ìîæåò áûòü óïðàâëÿþùèì äëÿíå áîëåå ÷åì îäíîãî ñåàíñà, è êàæäûé ñåàíñ ìîæåò èìåòü íå áîëåå îäíîãîóïðàâëÿþùåãî òåðìèíàëà.
Ïðè óñïåøíîì âûïîëíåíèè setsid() ïðîöåññ òåðÿåò óïðàâëÿþùèé òåðìèíàë, äàæå åñëè ïðè ýòîì ó íåãî îñòàþòñÿ ñâÿçàííûåñ òåðìèíàëîì îòêðûòûå äåñêðèïòîðû. ×òîáû ñíîâà ïîëó÷èòü óïðàâëÿþùèéòåðìèíàë, ïðîöåññó ñëåäóåò îòêðûòü âûçîâîì open() ôàéë òåðìèíàëüíîãîóñòðîéñòâà, íå ÿâëÿþùåãîñÿ óïðàâëÿþùèì íè äëÿ êàêîãî ñåàíñà.Äëÿ ñìåíû ãðóïïû ñóùåñòâóåò âûçîâint setpgid(int pid, int pgid);Ïàðàìåòð pid çàäàåò íîìåð ïðîöåññà, êîòîðûé íóæíî ïåðåâåñòè â äðóãóþãðóïïó; pgid − íîìåð ýòîé ãðóïïû.
Ñìåíèòü ãðóïïó ïðîöåññ ìîæåò ëèáîñàìîìó ñåáå, ëèáî ñâîåìó ïðÿìîìó ïîòîìêó, åñëè òîëüêî ýòîò ïîòîìîê åùå íåâûïîëíèë âûçîâ exec. Ãðóïïó ìîæíî ìåíÿòü ëèáî íà óæå ñóùåñòâóþùóþ âðàìêàõ äàííîãî ñåàíñà, ëèáî ìîæíî çàäàòü pgid ðàâíûì pid, â ýòîì ñëó÷àåñîçäàåòñÿ íîâàÿ ãðóïïà, à ïðîöåññ ñòàíîâèòñÿ åå ëèäåðîì.Åñëè ó ñåàíñà åñòü óïðàâëÿþùèé òåðìèíàë, ìîæíî óêàçàòü äðàéâåðó òåðìèíàëà, êàêóþ ãðóïïó ïðîöåññîâ ñ÷èòàòü îñíîâíîé.
Ýòî äåëàåòñÿ ñ ïîìîùüþáèáëèîòå÷íîé ôóíêöèèint tcsetpgrp(int fd, int pgrp);Çäåñü fd − ôàéëîâûé äåñêðèïòîð, êîòîðûé äîëæåí áûòü ñâÿçàí ñ óïðàâëÿþùèì òåðìèíàëîì (îáû÷íî èñïîëüçóåòñÿ 0 èëè 1). Äåñêðèïòîð íåîáõîäèì,ïîòîìó ÷òî ñìåíà îñíîâíîé ãðóïïû ðåàëèçóåòñÿ ÷åðåç âûçîâ ioctl() äëÿòåðìèíàëà êàê ëîãè÷åñêîãî óñòðîéñòâà.14325.3Ïðîöåññû-äåìîíûÏîä äåìîíàìè ïîíèìàþòñÿ ïðîöåññû, íå ïðåäíàçíà÷åííûå äëÿ íåïîñðåäñòâåííîãî âçàèìîäåéñòâèÿ ñ ïîëüçîâàòåëÿìè ñèñòåìû.
Ïðèìåðàìè äåìîíîâìîãóò ñëóæèòü ïðîãðàììû-ñåðâåðà, îáñëóæèâàþùèå WWW èëè ýëåêòðîííóþ ïî÷òó. Ñóùåñòâóþò äåìîíû è äëÿ âûïîëíåíèÿ âíóòðèñèñòåìíûõ çàäà÷:òàê, äåìîí crond ïîçâîëÿåò àâòîìàòè÷åñêè çàïóñêàòü ðàçëè÷íûå ïðîãðàììûâ çàäàííûå ìîìåíòû âðåìåíè, à äåìîí ñèñòåìû ïå÷àòè ñîáèðàåò îò ïîëüçîâàòåëåé çàäàíèÿ íà ïå÷àòü è îòïðàâëÿåò èõ íà ïðèíòåðû.Äåìîíû îáû÷íî ðàñ÷èòàíû íà äëèòåëüíîå ôóíêöèîíèðîâàíèå; â íåêîòîðûõ ñèñòåìàõ äåìîíû ìîãóò ðàáîòàòü ãîäàìè áåç ïåðåçàïóñêà. Ïîýòîìó ïðèñòàðòå äåìîíà ïðèíèìàþòñÿ îïðåäåëåííûå ìåðû ê òîìó, ÷òîáû åãî ôóíêöèîíèðîâàíèå íå ìåøàëî ðàáîòå è àäìèíèñòðèðîâàíèþ ñèñòåìû.
Òàê, òåêóùèéêàòàëîã îáû÷íî ìåíÿåòñÿ íà êîðíåâîé, ÷òîáû íå ìåøàòü ñèñòåìíîìó àäìèíèñòðàòîðó ïðè íåîáõîäèìîñòè óäàëÿòü êàòàëîãè, ìîíòèðîâàòü è îòìîíòèðîâàòüäèñêè è ò.ï.ßñíî, ÷òî äåìîíó íå íóæåí óïðàâëÿþùèé òåðìèíàë (è âîîáùå äåñêðèïòîðû ñòàíäàðòíîãî ââîäà, âûâîäà è âûäà÷è ñîîáùåíèé îá îøèáêàõ). Ïðè ýòîì,îäíàêî, æåëàòåëüíî, ÷òîáû äåñêðèïòîðû 0, 1 è 2 îñòàâàëèñü îòêðûòû, ïîòîìó÷òî äåìîíû, åñòåñòâåííî, ðàáîòàþò ñ ôàéëàìè, è åñëè êàêîé-ëèáî ôàéë áóäåò îòêðûò ñ íîìåðîì äåñêðèïòîðà 0, 1 èëè 2 (à ýòî îáÿçàòåëüíî ïðîèçîéäåò,åñëè äåñêðèïòîðû áóäóò çàêðûòû), êàêàÿ-íèáóäü ïðîöåäóðà ìîæåò ñëó÷àéíîèñïîðòèòü ôàéë, ïîïûòàâøèñü îñóùåñòâèòü ââîä/âûâîä íà ñòàíäàðòíûõ äåñêðèïòîðàõ.
Ïîýòîìó âñå òðè ñòàíäàðòíûõ äåñêðèïòîðà îáû÷íî ñâÿçûâàþò ñóñòðîéñòâîì /dev/null. Ýòî ñèìâîëüíîå (òî åñòü áàéò-îòðèåíòèðîâàííîå, èëèïîòîêîâîå) óñòðîéñòâî ÿâëÿåòñÿ ÷èñòî ëîãè÷åñêèì. Âñå, ÷òî â íåãî çàïèñûâàåòñÿ, ïîïðîñòó èñ÷åçàåò, à ïîïûòêà ÷òåíèÿ èç íåãî ñðàçó ñîçäàåò ñèòóàöèþêîíåö ôàéëà.×òîáû äåéñòâèÿ, ïðîèçâîäèìûå ñ êàêèì-ëèáî òåðìèíàëîì, íå ñêàçàëèñüíà ôóíêöèîíèðîâàíèè äåìîíà (íàïðèìåð, áûëî áû íåæåëàòåëüíî ïîëó÷èòü âíåêèé ìîìåíò SIGHUP èç-çà òîãî, ÷òî ïîëüçîâàòåëü ïðåêðàòèë ðàáîòó ñ òåðìèíàëîì), îí îáû÷íî ðàáîòàåò â îòäåëüíîì ñåàíñå.Òàêèì îáðàçîì, ïðîöåäóðà ñòàðòà ïðîöåññà-äåìîíà ìîæåò âûãëÿäåòü ïðèáëèçèòåëüíî òàê:close(0);close(1);close(2);open("/dev/null", O_RDONLY); /* stdin */open("/dev/null", O_WRONLY); /* stdout */open("/dev/null", O_WRONLY); /* stderr */144if(fork()>0) exit(0); /* change pid */setsid();chdir("/");Ïîñêîëüêó ñ òåðìèíàëàìè ïðîöåññ-äåìîí íå ñâÿçàí, âñåâîçìîæíûå ñîîáùåíèÿ îá îøèáêàõ, ïðåäóïðåæäåíèÿ, èíôîðìàöèîííûå ñîîáùåíèÿ è ò.ï., àäðåñîâàííûå ñèñòåìíîìó àäìèíèñòðàòîðó, ïðèõîäèòñÿ ïåðåäàâàòü íåêîòîðûì àëüòåðíàòèâíûì ñïîñîáîì.
Îáû÷íî ýòî äåëàåòñÿ÷åðåç èíôðàñòðóêòóðó ñèñòåìíîé æóðíàëèçàöèè.3Äëÿ ýòîãî èñïîëüçóþòñÿ ñëåäóþùèå áèáëèîòå÷íûå ôóíêöèè :void openlog(const char *ident, int option, int facility);void syslog(int priority, const char *format, ...);void closelog(void);×òîáû íà÷àòü ðàáîòó ñ ñèñòåìîé æóðíàëèçàöèè, ïðîãðàììà âûçûâàåòopenlog(),ïåðåäà-âàÿ ïåðâûì ïàðàìåòðîì ñâîå íàçâàíèå (èëè èíóþ èäåíòèôèöèðóþùóþ ñòðîêó), óêàçûâàÿíåêîòîðûå äîïîëíèòåëüíûå îïöèè â ïàðàìåòðåoptions(â áîëüøèíñòâå ñëó÷àåâ äîñòàòî÷-íî ïåðåäàòü ÷èñëî 0) è óêàçûâàÿ, ê êàêîé ïîäñèñòåìå îòíîñèòñÿ äàííàÿ ïðîãðàììà, ÷åðåçïàðàìåòðfacility.Íàèáîëåå ïîïóëÿðíûå ïîäñèñòåìû (íàïðèìåð, ïî÷òîâûé ñåðâåð) èìåþòñïåöèàëüíûå çíà÷åíèÿ ýòîãî ïàðàìåòðà, ïðî÷èì ïðîãðàììàì ñëåäóåò èñïîëüçîâàòü êîíñòàíòóLOG_USER.Ôóíêöèÿsyslog()printf().
Ïåðâûì ïàðàìåòðîì óêàçûâàåòñÿ ñòåLOG_ERR èñïîëüçóåòñÿ ïðè âîçíèêíîâåíèè íåóñòðàíèïðåäóïðåæäåíèé, LOG_INFO − äëÿ ïðîñòûõ èíôîðìàöèîííûõïîõîæà íà ôóíêöèþïåíü âàæíîñòè ñîîáùåíèÿ (íàïðèìåð,ìîé îøèáêè,LOG_WARN −äëÿñîîáùåíèé). Ñèñòåìíûé àäìèíèñòðàòîð ìîæåò íàñòðîèòü ñèñòåìó æóðíàëèçàöèè òàê, ÷òîáû âôàéëû æóðíàëîâ ïîïàäàëè òîëüêî ñîîáùåíèÿ ñ îïðåäåëåííûì óðîâíåì âàæíîñòè. Âòîðîé ïàðàìåòð− ýòî ôîðìàòíàÿ ñòðîêà, àíàëîãè÷íàÿ èñïîëüçóåìîé â ôóíêöèè printf(). Íàïðèìåð,âûçîâ ìîæåò âûãëÿäåòü òàê:syslog(LOG_INFO, "Daemon started with pid == %d", getpid());Ôóíêöèÿcloselog()çàâåðøàåò ðàáîòó ñ ñèñòåìîé æóðíàëèçàöèè, çàêðûâàÿ îòêðûòûåôàéëû è ò.ï.Óïðàâëåíèå ïðîöåññàìè-äåìîíàìè ìîæåò îñóùåñòâëÿòüñÿ ÷åðåç ñèãíàëû; òàê, ìíîãèå äåìîíû â îòâåò íà ñèãíàëSIGHUP ïåðå÷èòûâàþò êîíôèãóðàöèîííûå ôàéëû è ïðè íåîáõîäèìîñòèìåíÿþò ðåæèìû ðàáîòû.  áîëåå ñëîæíûõ ñëó÷àÿõ âîçìîæíû è äðóãèå ñõåìû óïðàâëåíèÿ.26Çàãðóçêà è æèçíåííûé öèêë ÎÑ UNIXÏîñëå âêëþ÷åíèÿ êîìïüþòåðà óïðàâëåíèå ïîëó÷àåò íåáîëüøàÿ ïðîãðàììà, íàõîäÿùàÿñÿ â ÏÇÓ.
Ïîñëå âûïîëíåíèÿ íåêîòîðûõ äåéñòâèé ïî ïðîâåðêåîáîðóäîâàíèÿ ýòà ïðîãðàììà îïðåäåëÿåò çàãðóçî÷íîå óñòðîéñòâî (çàãðóçî÷íûé äèñê), ñ÷èòûâàåò â ïàìÿòü ïåðâûé ñåêòîð ýòîãî äèñêà (íàçûâàåìûé òàêæå çàãðóçî÷íûì ñåêòîðîì ) è ïåðåäàåò óïðàâëåíèå íà ñ÷èòàííûé êîä.3 Èõ ðåàëèçàöèÿ çàâèñèò îò êîíêðåòíîé ñèñòåìû. Íàïðèìåð, äåìîí, îòâå÷àþùèé çà ñèñòåìíóþ æóðíàëè-çàöèþ, ìîæåò äåðæàòü îòêðûòûé îáùåäîñòóïíûé ñîêåò, â êîòîðûé è áóäóò ïèñàòü ôóíêöèè æóðíàëèçàöèè145Ïîñêîëüêó ðàçìåð ñåêòîðà ñðàâíèòåëüíî íåâåëèê (îáû÷íî 512 áàéò, ïðè÷åì íà÷àëüíûé ñåêòîð ìîæåò ñîäåðæàòü åùå äàííûå ïîìèìî çàãðóçî÷íîãîêîäà), ïðîãðàììà, çàïèñàííàÿ â çàãðóçî÷íûé ñåêòîð, äîñòàòî÷íî ïðîñòà è íåìîæåò âûïîëíèòü ñëîæíûõ äåéñòâèé.
Ïîýòîìó åå ðîëü çàêëþ÷àåòñÿ â çàãðóçêå â ïàìÿòü áîëåå ñëîæíîé ïðîãðàììû, çàïèñàííîé íà äèñêå â ñïåöèàëüíûõîáëàñòÿõ (ýòè îáëàñòè ðàçëè÷íû â ðàçíûõ îïåðàöèîííûõ ñèñòåìàõ è äëÿ ðàçíûõ âåðñèé çàãðóçî÷íûõ ïðîãðàìì). Ýòà ïðîãðàììà íàçûâàåòñÿ çàãðóç÷èêîìîïåðàöèîííîé ñèñòåìû è ìîæåò áûòü óæå ñðàâíèòåëüíî ñëîæíîé. Òàê, çàãðóç÷èê ÎÑ FreeBSD èìååò ñîáñòâåííóþ êîìàíäíóþ ñòðîêó, ïîçâîëÿþùóþâûáðàòü, êàêîé ðàçäåë ñ÷èòàòü êîðíåâûì, èç êàêîãî ôàéëà çàãðóæàòü ÿäðî,è ò.ï., ïðè ýòîì âîçìîæåí äàæå ïðîñìîòð êàòàëîãîâ íà äèñêàõ.
Çàãðóç÷èêÎÑ Linux (LILO) íå ñòîëü ãèáîê â âîçìîæíîñòÿõ: îí îáëàäàåò ñïîñîáíîñòüþçàãðóæàòü àëüòåðíàòèâíûå îïåðàöèîííûå ñèñòåìû, âûáèðàòü îäíî èç ïðåäîïðåäåëåííûõ ÿäåð äëÿ çàãðóçêè è ïåðåäàâàòü ÿäðó ïàðàìåòðû, íî ôîðìàòôàéëîâîé ñèñòåìû íå ïîíèìàåò è ïðîñìàòðèâàòü äèñêè íå ïîçâîëÿåò. ßäðîîí çàãðóæàåò èç ôèêñèðîâàííîãî íàáîðà ôèçè÷åñêèõ ñåêòîðîâ äèñêà. Ïðèýòîì çàãðóç÷èê ìîæåò áûòü óñòàíîâëåí ñ ïîääåðæêîé äîñòàòî÷íî êðàñèâîãîãðàôè÷åñêîãî èíòåðôåéñà4 .Çàãðóç÷èê çàãðóæàåò â ïàìÿòü âûáðàííîå ÿäðî è ïåðåäàåò óïðàâëåíèå åãîèíèöèàëèçàöèîííîìó êîäó. ßäðî èíèöèàëèçèðóåò ñâîè ïîäñèñòåìû, âêëþ÷àÿäðàéâåðû óñòðîéñòâ, ÷òî âêëþ÷àåò, åñòåñòâåííî, è ïðîâåðêó äîñòóïíîãî îáîðóäîâàíèÿ.