А.В. Столяров - Введение в операционные системы (1152218), страница 26
Текст из файла (страница 26)
 îáîèõ ñëó÷àÿõ ïðîöåññû,çàïóñêàåìûå íàìè (íà óäàëåííîé ìàøèíå ëèáî â îêîøêå xterm), ðàáîòàþòïîä óïðàâëåíèåì âèðòóàëüíîãî òåðìèíàëà (ïñåâäîòåðìèíàëà ). ßäðî îáñëóæèâàåò ýòè ïðîöåññû òî÷íî òàêèì æå îáðàçîì, êàê è çàïóùåííûå íà êîíñîëè,ñ òîé òîëüêî ðàçíèöåé, ÷òî ôóíêöèîíèðîâàíèå ôèçè÷åñêîãî òåðìèíàëà ýìóëèðóåòñÿ íåêèì ïðîöåññîì.  ñëó÷àå óäàëåííîãî äîñòóïà òàêèì ýìóëÿòîðîìÿâëÿåòñÿ ñåðâåð óäàëåííîãî äîñòóïà (ïðîãðàììà, ïðèíèìàþùàÿ ñîåäèíåíèÿíà óäàëåííîé ìàøèíå). Ïðîãðàììà xterm ýìóëèðóåò òåðìèíàë ñàìà.×òîáû ïîíÿòü, â ÷åì çàêëþ÷àåòñÿ ôóíêöèîíèðîâàíèå òåðìèíàëà, ðàññìîòðèì ïðîñòåéøèé ïðèìåð − íàæàòèå êîìáèíàöèè êëàâèø Ctrl-C.
Èçâåñòíî,÷òî ïðè ýòîì àêòèâíàÿ ïðîãðàììà ïîëó÷àåò ñèãíàë SIGINT; âîïðîñ òîëüêî âòîì, îòêóäà ýòîò ñèãíàë áåðåòñÿ. ßñíî, ÷òî îáû÷íûé òåðìèíàë − óñòðîéñòâî,ïåðåäàþùåå è ïðèíèìàþùåå äàííûå, − íè÷åãî íå çíàåò î ñèãíàëàõ ÎÑ Unix (è116âîîáùå ìîæåò ðàáîòàòü ñ ðàçíûìè îïåðàöèîííûìè ñèñòåìàìè). Ïîýòîìó ëîãè÷íî ïðåäïîëîæèòü, ÷òî ñèãíàë ãåíåðèðóåò ñàìà ñèñòåìà, ïîëó÷èâ îò òåðìèíàëà íåêèé ñïåöèàëüíûé ñèìâîë. Ýòî äåéñòâèòåëüíî òàê: ïî íàæàòèþ Ctrl-Câ äåéñòâèòåëüíîñòè ãåíåðèðóåòñÿ ñèìâîë ñ êîäîì 3 (âîîáùå, Ctrl-A ãåíåðèðóåò 1, Ctrl-B − 2, è ò.ä.).
Ïîëó÷èâ ýòîò ñèìâîë, äðàéâåð òåðìèíàëà ðàññûëàåòâñåì ïðîöåññàì îñíîâíîé ãðóïïû â òåêóùåì ñåàíñå ïîä óïðàâëåíèåì äàííîãîòåðìèíàëà ñèãíàë SIGINT. Êñòàòè, ñ ïîìîùüþ ôóíêöèè tcsetattr() äðàéâåð òåðìèíàëà ìîæíî ïåðåïðîãðàììèðîâàòü, ÷òîáû îí îòïðàâëÿë SIGINT ïîêàêîé-ëèáî äðóãîé êîìáèíàöèè êëàâèø, òîãäà ñèìâîë ñ êîäîì 3 áóäåò ïðîñòîîòïðàâëåí ðàáîòàþùåé ïðîãðàììå íà ñòàíäàðòíûé ââîä.Ðàññìîòðèì ñèòóàöèþ ñ ïðîãðàììîé xterm. ßñíî, ÷òî ïðè íàæàòèè Ctrl-Cïîëó÷èòü SIGINT äîëæíà íå ñàìà ïðîãðàììà xterm, à òå ïðîöåññû, êîòîðûåçàïóùåíû â åå îêîøêå. Ñîáñòâåííî ãîâîðÿ, ñàìà ïî ñåáå ïðîãðàììà xterm,áóäó÷è îêîííûì ïðèëîæåíèåì, è íå ïîëó÷àåò íèêàêîãî SIGINT, ïî êðàéíåéìåðå, êîãäà àêòèâíî èìåííî åå îêíî è ìû íàæàëè Ctrl-C.
Âìåñòî ýòîãî îíàïîëó÷àåò êëàâèàòóðíîå ñîáûòèå îò ñèñòåìû XWindow, ñâèäåòåëüñòâóþùåå îíàæàòèè êîìáèíàöèè êëàâèø. Íî ãåíåðèðîâàòü ñèãíàë äëÿ çàïóùåííûõ ïîäåå óïðàâëåíèåì ïðîöåññîâ åé íå íóæíî, äîñòàòî÷íî ïåðåäàòü ñèìâîë ñ êîäîì3 äðàéâåðó ïñåâäîòåðìèíàëà, è äðàéâåð ïîñòóïèò òî÷íî òàê æå, êàê åñëè áûíà ìåñòå ïðîãðàììû áûë íàñòîÿùèé òåðìèíàë − òî åñòü ïåðåõâàòèò ñèìâîëè âìåñòî íåãî âûäàñò ñèãíàë SIGINT.Ïðèìåðíî òàê æå îáñòîÿò äåëà è ïðè íàæàòèè Ctrl-D. Ïðîãðàììå xtermíåò íåîáõîäèìîñòè çàêðûâàòü êàíàë ñâÿçè ñ àêòèâíîé ïðîãðàììîé, âïîëíÿþùåéñÿ â åå îêîøêå, òåì áîëåå ÷òî ýòî è íåëüçÿ äåëàòü, âåäü ñåàíñ îäíèì EOF'îìíå çàêàí÷èâàåòñÿ, â íåì ìîãóò áûòü è äðóãèå çàïóùåííûå ïðîãðàììû2 .
Âìåñòî ýòîãî ïðîãðàììà xterm ïðîñòî ïåðåäàåò äðàéâåðó òåðìèíàëà ñèìâîë, ñîîòâåòñòâóþùèé êîìáèíàöèè Ctrl-D (òî åñòü ñèìâîë ñ êîäîì 4). Ïîëó÷èâ åãî,äðàéâåð òåðìèíàëà îáåñïå÷èò, ÷òîáû áëèæàéøèé âûçîâ read(), âûïîëíåííûéíà ïîääåðæèâàåìîì èì ëîãè÷åñêîì òåðìèíàëå, âåðíóë 0 (òî åñòü ñèãíàëèçèðîâàë î ñèòóàöèè êîíåö ôàéëà).Òàêèì îáðàçîì, ïñåâäîòåðìèíàë êàê îáúåêò ÿäðà èìååò äâà äâóñòîðîííèõêàíàëà ñâÿçè, îäèí äëÿ ïðîãðàììû, ýìóëèðóþùåé ôóíêöèîíèðîâàíèå òåðìèíàëà (â íàøåì ïðèìåðå ýòî xterm), âòîðîé äëÿ ïðîãðàìì, âûïîëíÿþùèõñÿïîä óïðàâëåíèåì íàøåãî òåðìèíàëà. Ïðîãðàììà, ýìóëèðóþùàÿ òåðìèíàë, âäàííîì âèäå âçàèìîäåéñòâèÿ íàçûâàåòñÿ ãëàâíîé (master), à ðàáîòàþùèå ïîäóïðàâëåíèåì òåðìèíàëà − ïîä÷èíåííûìè (slaves).×òîáû ñîçäàòü ïñåâäîòåðìèíàë, ãëàâíàÿ ïðîãðàììà âûçûâàåò ôóíêöèþint getpt();2 Ïðåäñòàâüòå,÷òî âû â îêîøêå xterm'à çàïóñòèëè êîìàíäó cat, ïîòîì íàæàëè Ctrl-D, à âìåñòî òîãî,÷òîáû âåðíóòüñÿ â êîìàíäíûé èíòåðïðåòàòîð, xterm çàêðûëñÿ117âîçâðàùàþùóþ äåñêðèïòîð êàíàëà ñâÿçè ñ ïñåâäîòåðìèíàëîì (äëÿ ãëàâíîéïðîãðàììû).
Ïðè ýòîì â ôàéëîâîé ñèñòåìå ïîÿâëÿåòñÿ ôàéë óñòðîéñòâà, îòêðûòèå êîòîðîãî ïîçâîëèò ïðèñîåäèíèòüñÿ ê òîìó æå ïñåâäîòåðìèíàëó óæåñî ñòîðîíû ïîä÷èíåííûõ ïðîãðàìì. Ýòî ëîãè÷åñêîå óñòðîéñòâî íàçûâàåòñÿïîä÷èíåííûé ïñåâäîòåðìèíàë (àíãë. pseudoterminal slave, ñîêðàùåííî pts ).Çàòåì íåîáõîäèìî ïðèìåíèòü ê ïîëó÷åííîìó äåñêðèïòîðó ïîñëåäîâàòåëüíî ôóíêöèèint grantpt(int fd);int unlockpt(int fd);Ïåðâàÿ èç íèõ èçìåíÿåò ïðèíàäëåæíîñòü ôàéëà óñòðîéñòâà ïîä÷èíåííîãîïñåâäîòåðìèíàëà òàê, ÷òî îí ñòàíîâèòñÿ äîñòóïåí âëàäåëüöó òåêóùåãî ïðîöåññà.
Ïåðåä âûçîâîì grantpt() ïðîãðàììà, ýìóëèðóþùàÿ òåðìèíàë, ìîæåò, íàïðèìåð,ñìåíèòü ñâîéuidñ ñóïåðïîëüçîâàòåëüñêîãî íàuidêîíêðåòíîãî ïîëüçîâàòåëÿ.Âòîðàÿ ôóíêöèÿ ðàçðåøàåò îòêðûòèå ôàéëà ïñåâäîòåðìèíàëà ñ ïîìîùüþâûçîâà open() (äî ýòîãî îí íåäîñòóïåí ê îòêðûòèþ, ñ òåì ÷òîáû ãëàâíàÿïðîãðàììà èìåëà âîçìîæíîñòü óñòàíîâèòü ïðàâà äîñòóïà ê íåìó äî òîãî, êàêêòî-ëèáî åãî îòêðîåò).Ïîñëå ýòîãî ïñåâäîòåðìèíàë ãîòîâ ê ðàáîòå, è åãî ìîæíî îòêðûòü ñ ïîìîùüþ open().
Íàïðèìåð, ìîæíî ñîçäàòü äî÷åðíèé ïðîöåññ, òàì çàêðûòüïîòîêè ñòàíäàðòíîãî ââîäà, âûâîäà è îøèáîê, ïîñëå ÷åãî îòêðûòü ïñåâäîòåðìèíàë è ñâÿçàòü åãî äåñêðèïòîð ñî âñåìè òðåìÿ ïîòîêàìè, à ïîòîì âûïîëíèòüexec äëÿ âûçîâà ïîä÷èíåííîé ïðîãðàììû. Óçíàòü èìÿ ôàéëà óñòðîéñòâà ïîä÷èíåííîãî ïñåâäîòåðìèíàëà ìîæíî ñ ïîìîùüþ ôóíêöèèchar *ptsname(int master_fd);ãäå master_fd − äåñêðèïòîð, ïîëó÷åííûé îò getpt().Âñþ ðàáîòó, ñâÿçàííóþ ñ ñîçäàíèåì îïèñàííîé ñâÿçêè ãëàâíûé-ïîä÷èíåííûé, ìîæíî âûïîëíèòü è ïðîùå, ñ ïîìîùüþ îäíîé ôóíêöèè:int openpty(int *master, int *slave, char *name,struct termios *termp, struct winsize *winp);Ïàðàìåòðûmasterèslaveçàäàþò àäðåñà ïåðåìåííûõ, â êîòîðûå ñëåäóåò çàïèñàòü äåñêðèï-òîðû, ñâÿçàííûå, ñîîòâåòñòâåííî, ñ ãëàâíûì è ïîä÷èíåííûì êàíàëàìè ñâÿçè ñ ïñåâäîòåðìèíàëîì.
Ïàðàìåòðnameïñåâäîòåðìèíàëà, ïàðàìåòðûóêàçûâàåò íà áóôåð, êóäà ñëåäóåò çàïèñàòü èìÿ ïîä÷èíåííîãîtermpèwinpçàäàþò ðåæèì ðàáîòû ïñåâäîòåðìèíàëà.  êà÷å-ñòâå ëþáîãî èç ïîñëåäíèõ òðåõ ïàðàìåòðîâ ìîæíî ïåðåäàòü íóëåâîé óêàçàòåëü.22Êðàòêèå ñâåäåíèÿ î òðàññèðîâêåÒðàññèðîâêà ïðèìåíÿåòñÿ â îñíîâíîì ïðè îòëàäêå ïðîãðàìì.
 ðåæèìåòðàññèðîâêè îäèí ïðîöåññ (îòëàä÷èê) êîíòðîëèðóåò âûïîëíåíèå äðóãîãî ïðî118öåññà (îòëàæèâàåìîé ïðîãðàììû), ìîæåò îñòàíîâèòü åãî, ïðîñìîòðåòü è èçìåíèòü ñîäåðæèìîå åãî ïàìÿòè, âûïîëíèòü â ïîøàãîâîì ðåæèìå, óñòàíîâèòüòî÷êè îñòàíîâà, ïðîäîëæèòü âûïîëíåíèå äî òî÷êè îñòàíîâà èëè äî ñèñòåìíîãî âûçîâà, è ò.ï. ÎÑ Unix äëÿ ïîääåðæêè òðàññèðîâêè ââåäåí ñèñòåìíûé âûçîâint ptrace(int request, int pid, void *addr, void *data); êà÷åñòâå ïàðàìåòðà request âûçîâ ïîëó÷àåò îäíó èç âîçìîæíûõ êîìàíä(êàêèå êîíêðåòíî äåéñòâèÿ, ñâÿçàííûå ñ òðàññèðîâêîé, òðåáóþòñÿ). Èíòåðïðåòàöèÿ îñòàëüíûõ ïàðàìåòðîâ çàâèñèò îò êîìàíäû.Íà÷àòü òðàññèðîâêó ìîæíî äâóìÿ ñïîñîáàìè: çàïóñòèòü òðàññèðóåìóþïðîãðàììó ñ íà÷àëà èëè ïðèñîåäèíèòüñÿ ê ñóùåñòâóþùåìó (ðàáîòàþùåìó) ïðîöåññó.
 ïåðâîì ñëó÷àå îòëàä÷èê äåëàåò fork(), ïîðîæäåííûé ïðîöåññ ñíà÷àëà óñòàíàâëèâàåò ðåæèì îòëàäêè (âûçûâàåò ptrace() ñ êîìàíäîéPTRACE_TRACEME), çàòåì äåëàåò exec ïðîãðàììû, ïîäëåæàùåé òðàññèðîâêå.Ñðàçó ïîñëå exec ñèñòåìà îñòàíàâëèâàåò òðàññèðóåìûé ïðîöåññ è îòïðàâëÿåò ðîäèòåëüñêîìó ïðîöåññó (îòëàä÷èêó) ñèãíàë SIGCHLD. Îòëàä÷èê äîëæåíäîæäàòüñÿ ýòîãî ìîìåíòà ñ ïîìîùüþ âûçîâîâ ñåìåéñòâà wait, êîòîðûå â äàííîì ñëó÷àå áóäóò îæèäàòü íå îêîí÷àíèÿ äî÷åðíåãî ïðîöåññà, à åãî îñòàíîâàäëÿ òðàññèðîâêè.
Äàëåå îòëàä÷èê ìîæåò çàñòàâèòü îòëàæèâàåìûé ïðîöåññâûïîëíèòü îäèí øàã ñ ïîìîùüþ êîìàíäû PTRACE_SINGLESTEP, ïðîäîëæèòüåãî âûïîëíåíèå ñ ïîìîùüþ PTRACE_CONT, óçíàòü ñîäåðæèìîå ðåãèñòðîâ ñ ïîìîùüþ PTRACE_GETREGS, è ò.ï.Äëÿ ïðèñîåäèíåíèÿ ê ñóùåñòâóþùåìó ïðîöåññó èñïîëüçóåòñÿ âûçîâptrace() ñ êîìàíäîé PTRACE_ATTACH. Ñëåäóåò îòìåòèòü, ÷òî ïðè ýòîì îòëàä÷èê âî ìíîãèõ ñìûñëàõ íà÷èíàåò âûïîëíÿòü ðîëü ðîäèòåëüñêîãî ïðîöåññàïî îòíîøåíèþ ê îòëàæèâàåìîìó; â ÷àñòíîñòè, ñèãíàëû SIGCHLD ïîñûëàþòñÿ òåïåðü îòëàä÷èêó, à íå èñõîäíîìó ðîäèòåëüñêîìó ïðîöåññó, õîòÿ ôóíêöèÿgetppid() â îòëàæèâàåìîì ïðîöåññå ïðîäîëæàåò âîçâðàùàòü èäåíòèôèêàòîðíàñòîÿùåãî ðîäèòåëüñêîãî ïðîöåññà.119Ëåêöèÿ 102323.1Âçàèìîäåéñòâèå ïî ñåòè. ÑîêåòûÏîíÿòèå ïðîòîêîëà.
Ìîäåëü ISO OSIÏîä ïðîòîêîëîì îáìåíà (èëè äëÿ êðàòêîñòè ïðîñòî ïðîòîêîëîì) îáû÷íî ïîíèìàåòñÿ íàáîð ñîãëàøåíèé, êîòîðûì äîëæíû ñëåäîâàòü ó÷àñòíèêè îáìåíà èíôîðìàöèåé1 , ÷òîáû ïîíÿòü äðóã äðóãà.Ïðè ëþáîì îñìûñëåííîì âçàèìîäåéñòâèè ïî êîìïüþòåðíîé ñåòè çàäåéñòâóåòñÿ ñðàçó íåñêîëüêî ïðîòîêîëîâ, îòíîñÿùèõñÿ ê ðàçíûì óðîâíÿì. Òàê,ìîäåì, ñ ïîìîùüþ êîòîðîãî ìû âîøëè â ñåòü, ñëåäóåò ïðîòîêîëó, ôèêñèðóþùåìó ïðàâèëà ïåðåâîäà öèôðîâûõ äàííûõ â àíàëîãîâûé ñèãíàë, ïåðåäàþùèéñÿ ïî òåëåôîííîé ëèíèè, è îáðàòíî. Îäíîâðåìåííî çàïóùåííûé íàìèáðàóçåð ñâÿçûâàåòñÿ ñ ñàéòîì â ñåòè Internet, èñïîëüçóÿ òðàíñïîðòíûé ïðîòîêîë TCP. Ñåðâåð è áðàóçåð îáìåíèâàþòñÿ èíôîðìàöèåé, èñïîëüçóÿ ïðîòîêîëHTTP (hypertext transfer protocol).Ñóùåñòâóåò ñòàíäàðòíàÿ ìîäåëü (ISO/OSI), ïðåäïîëàãàþùàÿ ðàçäåëåíèå âñåõ ñåòåâûõ ïðîòîêîëîâ íà ñåìü óðîâíåé. ISO ðàñøèôðîâûâàåòñÿ êàêInternational Standard Organization (îðãàíèçàöèÿ, óòâåðäèâøàÿ ñîîòâåòñòâóþùèé ñòàíäàðò), OSI îçíà÷àåò Open Systems Interconnection (áóêâàëüíî ïåðåâîäèòñÿ êàê âçàèìîñîåäèíåíèå îòêðûòûõ ñèñòåì, íî îáû÷íî ïðè ïåðåâîäåèñïîëüçóåòñÿ ñëîâî âçàèìîäåéñòâèå).Ìîäåëü âêëþ÷àåò ñåìü óðîâíåé:• Ôèçè÷åñêèé.
Ñîãëàøåíèÿ îá èñïîëüçîâàíèè ôèçè÷åñêîãî ñîåäèíåíèÿìåæäó ìàøèíàìè, âêëþ÷àÿ êîëè÷åñòâî ïðîâîäîâ â êàáåëå, ÷àñòîòó èäðóãèå õàðàêòåðèñòèêè ñèãíàëà, è ò.ï.• Êàíàëüíûé. Ñîãëàøåíèÿ î òîì, êàê áóäåò èñïîëüçîâàòüñÿ ôèçè÷åñêàÿñðåäà äëÿ ïåðåäà÷è äàííûõ; ýòî âêëþ÷àåò, íàïðèìåð, êîððåêöèþ îøèáîê• Ñåòåâîé.
Êîìïüþòåðíàÿ ñåòü îáû÷íî ñîñòîèò èç ìíîæåñòâà êàíàëîâ,ñîåäèíÿþùèõ êîìïüþòåðû. Íåêîòîðûå êîìïüþòåðû, íàçûâàåìûå øëþçàìè, ïîäêëþ÷àþòñÿ ê íåñêîëüêèì êàíàëàì îäíîâðåìåííî è ïåðåäàþòïàêåòû èç îäíîãî êàíàëà â äðóãîé. Ñåòåâîé óðîâåíü ïðîòîêîëîâ îïðåäåëÿåò ñîãëàøåíèÿ î òîì, êàê äàííûå áóäóò ïåðåäàâàòüñÿ ïî ñåòè, òàê,÷òîáû èç ëþáîé òî÷êè ñåòè ìîæíî áûëî ïåðåäàòü äàííûå â ëþáóþ äðó1 Ýòîíå îáÿçàòåëüíî äîëæíû áûòü êîìïüþòåðû.
Ñêàæåì, àçáóêà Ìîðçå òàêæå ÿâëÿåòñÿ ñâîåãî ðîäàïðîòîêîëîì; áîëåå ñëîæíûé ïðèìåð íåêîìïüþòåðíîãî ïðîòîêîëà − ïðàâèëà ðàäèîîáìåíà ìåæäó ïèëîòàìèñàìîëåòîâ è íàçåìíûìè äèñïåò÷åðàìè.120••••ãóþ òî÷êó ñåòè, âíå çàâèñèìîñòè îò òîãî, ïî ñêîëüêèì êàíàëàì ïðèäåòñÿïåðåäàâàòü èíôîðìàöèþ, è ñêîëüêî øëþçîâ ïðè ýòîì áóäåò çàäåéñòâîâàíî.