А.В. Столяров - Введение в операционные системы (1152218), страница 18
Текст из файла (страница 18)
Ïðèìåðîì suid-ïðîãðàììû ÿâëÿåòñÿpasswd.Sticky Bit, óñòàíîâëåííûé íà èñïîëíÿåìîì ôàéëå, â íåêîòîðûõ âåðñèÿõ ÎÑ Unix îáîçíà-÷àåò, ÷òî ñåãìåíò êîäà ïðîãðàììû ñëåäóåò îñòàâèòü â ïàìÿòè äàæå ïîñëå òîãî, êàê ïðîãðàììàáóäåò çàâåðøåíà; ýòî ïîçâîëÿåò ýêîíîìèòü âðåìÿ íà çàãðóçêå â ïàìÿòü ïðîãðàìì, èñïîëíÿåìûõ÷àùå äðóãèõ.Äëÿ êàòàëîãîâSetGid Bitîçíà÷àåò, ÷òî, êàêîé áû ïîëüçîâàòåëü íè ñîçäàë â ýòîì êàòà-ëîãå ôàéë, â êà÷åñòâå ãðóïïû âëàäåëüöà äëÿ ýòîãî ôàéëà áóäåò óñòàíîâëåíà òà æå ãðóïïà,÷òî è ó ñàìîãî êàòàëîãà.Sticky Bitîçíà÷àåò, ÷òî, äàæå åñëè ïîëüçîâàòåëü èìååò ïðàâî íàçàïèñü â äàííûé êàòàëîã, óäàëèòü îí ñìîæåò òîëüêî ñâîè (ïðèíàäëåæàùèå åìó) ôàéëû.Äëÿ èçìåíåíèÿ ïðàâ äîñòóïà ê ôàéëàì èñïîëüçóåòñÿ êîìàíäà chmod4 .
Ýòàêîìàíäà ïîçâîëÿåò çàäàòü íîâûå ïðàâà äîñòóïà â âèäå âîñüìåðè÷íîãî ÷èñëà,íàïðèìåð:$ chmod 644 myfile.cóñòàíàâëèâàåò äëÿ ôàéëà myfile.c ïðàâà çàïèñè òîëüêî äëÿ âëàäåëüöà, àïðàâà ÷òåíèÿ − äëÿ âñåõ.Ïðàâà äîñòóïà òàêæå ìîæíî çàäàòü â âèäå ìíåìîíè÷åñêîé ñòðîêè âèäà[ugoa][+-=][rwxsXtugo] Áóêâû u, g, o è a â íà÷àëå îçíà÷àþò, ñîîòâåòñòâåííî, âëàäåëüöà (user), ãðóïïó (group), âñåõ îñòàëüíûõ (others) è âñåõ ñðàçó(all).
+ îçíà÷àåò äîáàâëåíèå íîâûõ ïðàâ, - − ñíÿòèå ñòàðûõ ïðàâ, = −óñòàíîâêó óêàçàííûõ ïðàâ è ñíÿòèå âñåõ îñòàëüíûõ. Ïîñëå çíàêà áóêâû r, w, x4 ñîêðàùåíèåñëîâ Change Mode77îçíà÷àþò, êàê ìîæíî äîãàäàòüñÿ, ïðàâà íà ÷òåíèå, çàïèñü è èñïîëíåíèå, áóêâà s − óñòàíîâêó/ñíÿòèå Set-áèòîâ (èìååò ñìûñë äëÿ âëàäåëüöà è ãðóïïû), tîáîçíà÷àåò Sticky Bit. Áóêâà X (çàãëàâíàÿ) îçíà÷àåò óñòàíîâêó/ñíÿòèå áèòàèñïîëíåíèÿ òîëüêî äëÿ êàòàëîãîâ, à òàêæå äëÿ òåõ ôàéëîâ, íà êîòîðûå õîòÿáû ó êîãî-íèáóäü åñòü ïðàâà èñïîëíåíèÿ.Åñëè êîìàíäó chmod èñïîëüçîâàòü ñ êëþ÷îì -R, îíà ïðîâåäåò ñìåíó ïðàâäîñòóïà êî âñåì ôàéëàì âî âñåõ ïîääèðåêòîðèÿõ çàäàííîé äèðåêòîðèè.Íàïðèìåð, êîìàíäà chmod a+x myscript ñäåëàåò ôàéë myscript èñïîëíÿåìûì; êîìàíäà chmod go-rwx * ñíèìåò ñî âñåõ ôàéëîâ â òåêóùåì êàòàëîãåâñå ïðàâà, êðîìå ïðàâ âëàäåëüöà.
Î÷åíü ïîëåçíîé ìîæåò îêàçàòüñÿ êîìàíäàchmod -R u+rwX,go=rX ~íà ñëó÷àé, åñëè âû ñëó÷àéíî èñïîðòèòå ïðàâà äîñòóïà â ñâîåé äîìàøíåé äèðåêòîðèè; ýòà êîìàíäà, ñêîðåå âñåãî, ïðèâåäåò âñå â óäîâëåòâîðèòåëüíîå ñîñòîÿíèå.Äëÿ ñèìâîëè÷åñêèõ ññûëîê ïðàâà îáû÷íî èãíîðèðóþñÿ è èñïîëüçóþòñÿïðàâà ôàéëà, íà êîòîðûå äàííàÿ ññûëêà ññûëàåòñÿ.ßñíî, ÷òî èçìåíèòü ïðàâà ïîëüçîâàòåëü ìîæåò òîëüêî äëÿ ïðèíàäëåæàùèõ åìó ôàéëîâ. Íà ïîëüçîâàòåëÿ ñ ïðàâàìè root ýòî îãðàíè÷åíèå íå äåéñòâóåò.12.312.3.1Ñèñòåìíûå âûçîâû äëÿ ðàáîòû ñ ôàéëàìèÎòêðûòèå ôàéëà×òîáû íà÷àòü ðàáîòó ñ ôàéëîì, åãî íåîáõîäèìî îòêðûòü, òî åñòü îáúÿâèòü îïåðàöèîííîé ñèñòåìå, ÷òî íàøà ïðîãðàììà ñîáèðàåòñÿ ðàáîòàòü ñ äàííûì ôàéëîì. Ýòî äåëàåòñÿ ñèñòåìíûì âûçîâîìint open(const char *name, int mode);int open(const char *name, int mode, int perms);Ïàðàìåòð name çàäàåò èìÿ ôàéëà, êîòîðûé ìû õîòèì îòêðûòü.
Ýòî ìîæåòáûòü êîðîòêîå èìÿ ôàéëà, íàõîäÿùåãîñÿ â òåêóùåì êàòàëîãå èëè æå ïóòü êôàéëó (êàê ïîëíûé, òàê è îòíîñèòåëüíûé).Ïàðàìåòð mode çàäàåò ðåæèì, â êîòîðîì ìû íàìåðåíû ðàáîòàòü ñ ôàéëîì.Îñíîâíûìè ðåæèìàìè ÿâëÿþòñÿ O_RDONLY (òîëüêî ÷òåíèå), O_WRONLY (òîëüêîçàïèñü) è O_RDWR (÷òåíèå è çàïèñü).
Îäíó èõ ýòèõ òðåõ êîíñòàíò óêàçàòüíåîáõîäèìî.Êðîìå ïåðå÷èñëåííûõ îñíîâíûõ êîíñòàíò, ñóùåñòâóþò åùå è ìîäèôèöèðóþùèå êîíñòàíòû, êîòîðûå ïðè íåîáõîäèìîñòè ìîæíî äîáàâèòü ê îñíîâíûì,èñïîëüçóÿ îïåðàöèþ ïîáèòîâîãî èëè. Ê ýòèì êîíñòàíòàì îòíîñÿòñÿ:78• O_APPEND − îòêðûòü ôàéë íà äîáàâëåíèå â êîíåö: êàæäàÿ îïåðàöèÿçàïèñè áóäåò îñóùåñòâëÿòü çàïèñü â êîíåö ôàéëà;• O_CREAT − åñëè ôàéëà íå ñóùåñòâóåò, ðàçðåøèòü îïåðàöèîííîé ñèñòåìååãî ñîçäàíèå;• O_TRUNC − åñëè ôàéë ñóùåñòâóåò, ïåðåä íà÷àëîì ðàáîòû ñáðîñèòü åãîñòàðîå ñîäåðæèìîå, â ðåçóëüòàòå ÷åãî äëèíà ôàéëà ñòàíåò íóëåâîé; çàïèñü íà÷íåòñÿ ñ íà÷àëà ôàéëà;• O_EXCL − (èñïîëüçóåòñÿ òîëüêî â ñî÷åòàíèè ñ O_CREAT) ïîòðåáîâàòü îòîïåðàöèîííîé ñèñòåìû ñîçäàíèÿ íîâîãî ôàéëà; åñëè ôàéë óæå ñóùåñòâóåò, íå îòêðûâàòü åãî, âûäàòü îøèáêó;Ñóùåñòâóþò è íåêîòîðûå äðóãèå ìîäèôèêàòîðû.Òðåòèé ïàðàìåòð (perms) ñëåäóåò çàäàâàòü òîëüêî â ñëó÷àå, åñëè çíà÷åíèå âòîðîãî ïàðàìåòðà ïðåäïîëàãàåò âîçìîæíîñòü ñîçäàíèÿ ôàéëà (òî åñòüåñëè èñïîëüçóåòñÿ O_CREAT).
Ýòîò ïàðàìåòð çàäàåò ïðàâà äîñòóïà äëÿ ñîçäàâàåìîãî ôàéëà. Çàáåãàÿ âïåðåä, îòìåòèì, ÷òî èç çíà÷åíèÿ ýòîãî ïàðàìåòðàñèñòåìà ïîáèòîâî âû÷èòàåò îïðåäåëåííîå ÷èñëî, íàçûâàåìîå umask. Ïîýòîìóïðè ñîçäàíèè îáû÷íîãî ôàéëà äàííûõ (òî åñòü ïðè óñëîâèè, ÷òîìû íå ñîáèðàåìñÿ åãî èñïîëíÿòü êàê ïðîãðàììó), ñëåäóåò çàäàâàòüçíà÷åíèå 0666, ÷òî îçíà÷àåò íàëè÷èå ïðàâ íà ÷òåíèå è çàïèñü (íî íå íà èñ-ïîëíåíèå) äëÿ âëàäåëüöà, ãðóïïû è âñåõ îñòàëüíûõ. Îáû÷íî ïðàâà íà çàïèñüäëÿ ãðóïïû è îñòàëüíûõ ïîëüçîâàòåëåé èñ÷åçàþò ïîñëå âû÷èòàíèÿ umask,åñëè æå ýòîãî íå ïðîèñõîäèò − çíà÷èò, òàê õîòåë ïîëüçîâàòåëü.Ñèñòåìíûé âûçîâ open() âîçâðàùàåò çíà÷åíèå -1 â ñëó÷àå, åñëè ïðîèçîøëà òà èëè èíàÿ îøèáêà. Åñëè æå ôàéë îòêðûòü óäàëîñü, âîçâðàùàåòñÿíåáîëüøîå öåëîå íåîòðèöàòåëüíîå ÷èñëî, íàçûâàåìîå äåñêðèïòîðîì ôàéëà 5 .Ôàéëîâûé äåñêðèïòîð íà ñàìîì äåëå ðàñïîëàãàåòñÿ â ÿäðå îïåðàöèîííîéñèñòåìû, ÿâëÿÿñü åå îáúåêòîì äàííûõ.
 ïîëüçîâàòåëüñêîì ïðîöåññå íàì äîñòóïåí ëèøü íîìåð äåñêðèïòîðà − öåëîå íåîòðèöàòåëüíîå ÷èñëî, èñïîëüçóåìîå, ÷òîáû ðàçëè÷àòü ìåæäó ñîáîé ôàéëîâûå äåñêðèïòîðû, ïðèíàäëåæàùèåîäíîìó è òîìó æå ïðîöåññó. Çàìåòèì, ÷òî íîìåð äåñêðèïòîðà ëîêàëåí ïî îòíîøåíèþ ê ïðîöåññó: ñêàæåì, äåñêðèïòîð 5 ìîæåò â îäíîì ïðîöåññå áûòüñâÿçàí ñ îäíèì ôàéëîì, â äðóãîì − ñ ñîâñåì äðóãèì, à â òðåòüåì è âîâñå íåñîîòâåòñòâîâàòü íèêàêîìó ïîòîêó ââîäà-âûâîäà.Äåñêðèïòîðû ìîãóò áûòü ñâÿçàíû íå òîëüêî ñ îòêðûòûìè ôàéëàìè íàäèñêå, íî è ñ ïîòîêàìè ââîäà-âûâîäà ïðîèçâîëüíîé ïðèðîäû.
Äåñêðèïòîðû ñ5 Äåñêðèïòîðûîòêðûòûõ ôàéëîâ íè â êîåì ñëó÷àå íå ñëåäóåò ïóòàòü ñ èíäåêñíûìè äåñêðèïòîðàìè, ýòîñîâåðøåííî ðàçíûå è íèêàê ìåæäó ñîáîé íå ñîîòíîñÿùèåñÿ ñóùíîñòè. Îòìåòèì, ÷òî â àíãëèéñêîì ÿçûêåñëîâî descriptor ïðèìåíÿåòñÿ òîëüêî äëÿ îáîçíà÷åíèÿ äåñêðèïòîðîâ îòêðûòûõ ôàéëîâ, òåðìèí æå èíäåêñíûé äåñêðèïòîð ïðåäñòàâëÿåò ñîáîé ïðèìåð íåóäà÷íîãî (íî ïðèæèâøåãîñÿ) ïåðåâîäà: îðèãèíàëüíûéàíãëîÿçû÷íûé òåðìèí index node âîîáùå íå ñîäåðæèò ñëîâà descriptor è áóêâàëüíî ìîæåò áûòü ïåðåâåäåíêàê èíäåêñíûé óçåë.79íîìåðàìè 0, 1 è 2 èãðàþò îñîáóþ ðîëü: ïðîãðàììû îáû÷íî èñõîäÿò èç ñîãëàøåíèÿ, ÷òî èìåííî äåñêðèïòîðû ñ ýòèìè íîìåðàìè ÿâëÿþòñÿ ñòàíäàðòíûìèïîòîêàìè ââîäà, âûâîäà è ñîîáùåíèé îá îøèáêàõ.
Îáû÷íî íà ìîìåíò çàïóñêàïðîãðàììû ýòè äåñêðèïòîðû óæå îòêðûòû.Ñêàçàííîå íå îçíà÷àåò, ÷òî ìû íå ìîæåì èñïîëüçîâàòü ýòè äåñêðèïòîðûäëÿ ñâîèõ öåëåé èëè ñâÿçàòü èõ ñ äðóãèìè ïîòîêàìè ââîäà-âûâîäà, â ÷àñòíîñòè, ñ ôàéëàìè. Ïîäðîáíåå ê ýòîìó âîïðîñó ìû åùå âåðíåìñÿ.12.3.2×òåíèå è çàïèñü×òåíèå èç ôàéëà (èëè, ãîâîðÿ áîëåå øèðîêî, èç ëþáîãî ïîòîêà ââîäà)ïðîèçâîäèòñÿ âûçîâîìint read(int fd, void *buf, int len);Ïàðàìåòð fd çàäàåò ôàéëîâûé äåñêðèïòîð; buf óêàçûâàåò íà áóôåð, â êîòîðûé ñëåäóåò ïîìåñòèòü ïðî÷èòàííûå äàííûå; len ñîîáùàåò âûçîâó ðàçìåðáóôåðà, ÷òîáû èçáåæàòü åãî ïåðåïîëíåíèÿ.Âûçîâ read() ïûòàåòñÿ ïðî÷èòàòü èç çàäàííîãî ïîòîêà len áàéò äàííûõ.Åñëè â óêàçàííîì ïîòîêå îòñóòñòâóþò äàííûå, ãîòîâûå ê ïðî÷òåíèþ, âûçîâáëîêèðóåò âûçâààâøèé ïðîöåññ äî òåõ ïîð, ïîêà äàííûå íå ïîÿâÿòñÿ, è òîëüêîïîñëå èõ ïðî÷òåíèÿ âåðíåò óïðàâëåíèå.
Åñëè äàííûå ïðèñóòñòâóþò, íî èõìåíåå ÷åì len áàéò, âûçîâ ñîõðàíèò èõ â buf è âåðíåò óïðàâëåíèå.Âûçîâ âîçâðàùàåò −1 â ñëó÷àå îøèáêè.  ñëó÷àå óñïåøíîãî ÷òåíèÿ âîçâðàùàåòñÿ ïîëîæèòåëüíîå ÷èñëî, îçíà÷àþùåå êîëè÷åñòâî ïðî÷èòàííûõ áàéò.Åñòåñòâåííî, ýòî ÷èñëî íå ìîæåò áûòü áîëüøå len.Îñîáûì ñëó÷àåì ÿâëÿåòñÿ âîçâðàùàåìîå çíà÷åíèå 0.
Åñëè read() âåðíóëíîëü, ýòî îçíà÷àåò, ÷òî â çàäàííîì ïîòîêå ââîäà íàñòóïèëà ñèòóàöèÿ êîíöà ôàéëà.  ÷àñòíîñòè, äëÿ îáû÷íîãî ôàéëà ýòî îçíà÷àåò, ÷òî ìû äî÷èòàëèäî åãî êîíöà è áîëüøå òàì ÷èòàòü íå÷åãî.Äëÿ çàïèñè â ôàéë (èëè äðóãîé ïîòîê âûâîäà) ìîæíî ïîëüçîâàòüñÿ âûçîâîìint write(int fd, const void *buf, int len);Ïàðàìåòð fd çàäàåò ôàéëîâûé äåñêðèïòîð; buf óêàçûâàåò íà áóôåð, ñîäåðæàùèé äàííûå, êîòîðûå íåîáõîäèìî çàïèñàòü â ôàéë (èëè äðóãîé ïîòîê âûâîäà);len çàäàåò êîëè÷åñòâî ýòèõ äàííûõ.Âûçîâ âîçâðàùàåò −1 â ñëó÷àå îøèáêè.
 ñëó÷àå óñïåøíîãî ÷òåíèÿ âîçâðàùàåòñÿ ïîëîæèòåëüíîå ÷èñëî, îçíà÷àþùåå êîëè÷åñòâî çàïèñàííûõ áàéò.Åñòåñòâåííî, ýòî ÷èñëî íå ìîæåò áûòü áîëüøå len.  áîëüøèíñòâå ñëó÷àåâ80÷èñëî çàïèñàííûõ áàéò â òî÷íîñòè ðàâíÿåòñÿ çíà÷åíèþ len, îäíàêî ïîëàãàòüñÿ íà ýòî îïàñíî.  êîððåêòíî íàïèñàííîé ïðîãðàììå çíà÷åíèå, âîçâðàùàåìîåâûçîâîì write(), îáÿçàòåëüíî äîëæíî ïðîâåðÿòüñÿ.12.3.3Çàêðûòèå ôàéëàÏîñëå îêîí÷àíèÿ ðàáîòû ñ ôàéëîì åãî ñëåäóåò çàêðûòü.
Ýòî îñîáåííî âàæíî, ïîñêîëüêó äåñêðèïòîðû ïðåäñòàâëÿþò ñîáîé îãðàíè÷åííûé ðåñóðñ (ïîïðîñòó ãîâîðÿ, èõ îáùåå êîëè÷åñòâî â ñèñòåìå íå ìîæåò ïðåâûøàòü íåêîòîðîãî÷èñëà, êàê è êîëè÷åñòâî äåñêðèïòîðîâ, îòêðûòûõ îäíèì ïðîöåññîì).Çàêðûòèå ôàéëà ïðîèçâîäèòñÿ âûçîâîìint close(int fd);ãäå fd − äåñêðèïòîð, ïîäëåæàùèé çàêðûòèþ. Âûçîâ âîçâðàùàåò 0 â ñëó÷àåóñïåõà, −1 â ñëó÷àå îøèáêè.Îòìåòèì, ÷òî ïðè çàâåðøåíèè ïðîöåññà âñå åãî äåñêðèïòîðû çàêðûâàþòñÿàâòîìàòè÷åñêè.12.3.4ÏîçèöèîíèðîâàíèåÏðè âûïîëíåíèè îïåðàöèé ÷òåíèÿ è çàïèñè äîñòóï àâòîìàòè÷åñêè îñóùåñòâëÿåòñÿ ê ïîñëåäîâàòåëüíûì ïîðöèÿì äàííûõ â ôàéëå.
Äîïóñòèì, ìûîòêðûëè ôàéë íà ÷òåíèå. Åñëè òåïåðü íà÷àòü âûçûâàòü read() ñ ïàðàìåòðîìlen, ðàâíûì 100, òî ïåðâûé âûçîâ ïðî÷èòàåò èç ôàéëà áàéòû ñ íóëåâîãî ïî99é, âòîðîé âûçîâ − áàéòû ñ 100ãî ïî 199é, òðåòèé − áàéòû ñ 200ãî ïî 299éè ò.ä.Ýòîò ïîðÿäîê ìîæíî ïðè íåîáõîäèìîñòè íàðóøèòü, èçìåíèâ â ÿâíîì âèäå çíà÷åíèå òåêóùåé ïîçèöèè, ñâÿçàííîé ñ ôàéëîâûì äåñêðèïòîðîì6 . Ýòîäåëàåòñÿ âûçîâîìint lseek(int fd, int offset, int whence);Ïàðàìåòð fd, êàê îáû÷íî, çàäàåò íîìåð ôàéëîâîãî äåñêðèïòîðà.
Ïàðàìåòðoffset óêàçûâàåò, íà ñêîëüêî áàéò ñëåäóåò ñìåñòèòüñÿ, è ïàðàìåòð whenceîïðåäåëÿåò, îò êàêîãî ìåñòà ýòè áàéòû ñëåäóåò îòñ÷èòûâàòü. Ïðè çíà÷åíèèwhence, ðàâíîì êîíñòàíòå SEEK_SET, îòñ÷åò ïîéäåò îò íà÷àëà ôàéëà; ïðè çíà÷åíèè SEEK_CUR − îò òåêóùåé ïîçèöèè, è ïðè çíà÷åíèè SEEK_END − îò êîíöàôàéëà. Âûçîâ âîçâðàùàåò íîâîå çíà÷åíèå òåêóùåé ïîçèöèè, ñ÷èòàÿ îò íà÷àëà.6 Êàêìû óâèäèì èç äàëüíåéøåãî, ýòî ìîæíî ñäåëàòü íå äëÿ ëþáîãî ôàéëîâîãî äåñêðèïòîðà.81Ðàññìîòðèì íåñêîëüêî ïðèìåðîâ. lseek(fd, 0, SEEK_SET) óñòàíîâèò òåêóùóþ ïîçèöèþ íà íà÷àëî ôàéëà, lseek(fd, 0, SEEK_END) − íà êîíåö ôàéëà. Âûçîâ lseek(fd, 0, SEEK_CUR) íèêàê ïîçèöèþ íå èçìåíèò, íî åãî ìîæíîèñïîëüçîâàòü, ÷òîáû óçíàòü òåêóùåå çíà÷åíèå ïîçèöèè. Ïðî÷èòàòü ïîñëåäíèå100 áàéò ôàéëà ìîæíî ñ ïîìîùüþ âûçîâîâ:int rc;char buf[100];/* ... */lseek(fd, -100, SEEK_END);rc = read(fd, buf, 100);Îòìåòèì, ÷òî ïðè ñìåíå ïîçèöèè ìîæíî çàéòè çà êîíåö ôàéëà.