А.В. Столяров - Введение в операционные системы (1114673), страница 25
Текст из файла (страница 25)
Îáû÷íîïîëüçîâàòåëüñêèå ïðîãðàììû íå èñïîëüçóþò ýòó âîçìîæíîñòü; â êà÷åñòâå ïàðàìåòðà start ìîæíî ïåðåäàòü NULL, òîãäà ñèñòåìà ñàìà âûáåðåò ñâîáîäíóþîáëàñòü âèðíóàëüíîãî àäðåñíîãî ïðîñòðàíñòâà.Âûçîâ mmap() âîçâðàùàåò óêàçàòåëü íà ñîçäàííóþ îáëàñòü âèðòóàëüíîéïàìÿòè. Îáû÷íî ýòîò óêàçàòåëü ïðåîáðàçóþò ê äðóãîìó òèïó, íàïðèìåð êchar*. ñëó÷àå îøèáêè mmap() âîçâðàùàåò çíà÷åíèå MAP_FAILED, ðàâíîå -1, ïðåîáðàçîâàííîé ê òèïó void*.Ïðèâåäåì ïðèìåð:int fd;char *ptr;fd = open("file.dat", O_RDWR);if(fd == -1) { /* ...
îáðàáîòêà îøèáêè ... */ }ptr = (char*) mmap(NULL, 4096, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);if(ptr == MAP_FAILED) { /* ... îáðàáîòêà îøèáêè ... */ }Ïîñëå âûïîëíåíèÿ ýòèõ äåéñòâèé âûðàæåíèå ptr[25] áóäåò ðàâíî çíà÷åíèþ 26ãî áàéòà â ôàéëå "file.dat", ïðè÷åì îïåðàöèÿ ïðèñâàèâàíèÿptr[25] = 'a' çàíåñåò â ýòîò áàéò ñèìâîë 'a'.Ðàññìîòðèì äðóãîé ïðèìåð:int *ptr;ptr = (char*) mmap(NULL, 4096, PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS, 0, 0);if(ptr == MAP_FAILED) { /* ... îáðàáîòêà îøèáêè ... */ }115if(fork() == 0) {/* ... äî÷åðíèé ïðîöåññ ... */} else {/* ... ðîäèòåëüñêèé ïðîöåññ ... */} ýòîì ïðèìåðå ðîäèòåëüñêèé è äî÷åðíèé ïðîöåññû èìåþò äîñòóï ê îäíîìóè òîìó æå ìàññèâó öåëûõ ÷èñåë (äëèíîé 1024 ýëåìåíòà, åñëè ñ÷èòàòü, ÷òî intçàíèìàåò 4 áàéòà).
Ìàññèâ äîñòóïåí ÷åðåç óêàçàòåëü ptr, òàê ÷òî åñëè îäèíèç ïðîöåññîâ ñäåëàåò ïðèñâàèâàíèå ptr[77] = 120, òî â îáîèõ ïðîöåññàõâûðàæåíèå ptr[77] áóäåò èìåòü çíà÷åíèå 120.Îòìåíèòü îòîáðàæåíèå, ñîçäàííîå âûçîâîì mmap(), ìîæíî ñ ïîìîùüþ âûçîâàint munmap(void *start, int lenght);Ôèçè÷åñêóþ çàïèñü â ôàéë èçìåíåíèé, ñäåëàííûõ â îáëàñòè îòîáðàæåíèÿ, ñèñòåìà ìîæåòïðîèçâåñòè íå ñðàçó.
Åñëè íåîáõîäèìî ãàðàíòèðîâàòü, ÷òî èçìåíåíèÿ ôèçè÷åñêè çàïèñàíû íàäèñê, ìîæíî âîñïîëüçîâàòüñÿ âûçîâîìmsync().Èçó÷åíèå ýòîãî âûçîâà îñòàâëÿåì ÷èòàòåëþäëÿ ñàìîñòîÿòåëüíîé ðàáîòû.21Âçàèìîäåéñòâèå ïðîöåññîâ ÷åðåç ïñåâäîòåðìèíàëÊàê óæå ãîâîðèëîñü, â ÎÑ Unix âàæíîå çíà÷åíèå èìååò ïîíÿòèå òåðìèíàëà.  íåêîòîðûõ ñëó÷àÿõ òåðìèíàë ïðèõîäèòñÿ ýìóëèðîâàòü ïðîãðàììíî −íàïðèìåð, â ñëó÷àå, åñëè ìû ïîëó÷àåì äîñòóï ê ìàøèíå óäàëåííî (ïî êîìïüþòåðíîé ñåòè), ëèáî ïðè çàïóñêå ïðîãðàììû xterm.  îáîèõ ñëó÷àÿõ ïðîöåññû,çàïóñêàåìûå íàìè (íà óäàëåííîé ìàøèíå ëèáî â îêîøêå 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 âûçîâ ïîëó÷àåò îäíó èç âîçìîæíûõ êîìàíä(êàêèå êîíêðåòíî äåéñòâèÿ, ñâÿçàííûå ñ òðàññèðîâêîé, òðåáóþòñÿ). Èíòåðïðåòàöèÿ îñòàëüíûõ ïàðàìåòðîâ çàâèñèò îò êîìàíäû.Íà÷àòü òðàññèðîâêó ìîæíî äâóìÿ ñïîñîáàìè: çàïóñòèòü òðàññèðóåìóþïðîãðàììó ñ íà÷àëà èëè ïðèñîåäèíèòüñÿ ê ñóùåñòâóþùåìó (ðàáîòàþùåìó) ïðîöåññó.