А.В. Столяров - Введение в операционные системы (1114673), страница 18
Текст из файла (страница 18)
 ïîëüçîâàòåëüñêîì ïðîöåññå íàì äîñòóïåí ëèøü íîìåð äåñêðèïòîðà − öåëîå íåîòðèöàòåëüíîå ÷èñëî, èñïîëüçóåìîå, ÷òîáû ðàçëè÷àòü ìåæäó ñîáîé ôàéëîâûå äåñêðèïòîðû, ïðèíàäëåæàùèåîäíîìó è òîìó æå ïðîöåññó. Çàìåòèì, ÷òî íîìåð äåñêðèïòîðà ëîêàëåí ïî îòíîøåíèþ ê ïðîöåññó: ñêàæåì, äåñêðèïòîð 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);Îòìåòèì, ÷òî ïðè ñìåíå ïîçèöèè ìîæíî çàéòè çà êîíåö ôàéëà. Ñàìî ïî ñåáå ýòî íå ïðèâîäèòê èçìåíåíèþ ðàçìåðà ôàéëà, íî åñëè ïîñëå ýòîãî ïðîèçâåñòè çàïèñü, ðàçìåð ôàéëà óâåëè÷èòñÿ (êîíå÷íî, ôàéë ïðè ýòîì äîëæåí áûòü îòêðûò â ðåæèìå, äîïóñêàþùåì çàïèñü). Ïðè ýòîìâîçìîæíî îáðàçîâàíèå äûðêè ìåæäó ïîñëåäíèìè äàííûìè ïåðåä ñòàðûì êîíöîì ôàéëà èïåðâûìè äàííûìè, çàïèñàííûìè ñ íîâîé ïîçèöèè. Òàêèì îáðàçîì, íàïðèìåð, ìîæíî ñîçäàòüíà ìåãàáàéòíîé äèñêåòå ôàéë ðàçìåðîì â ãèãàáàéò. Ýòî êîððåêòíî, ò.ê.
â ÎÑ Unix òàêèå äûðêè íå çàïîëíÿþòñÿ ðåàëüíûìè äàííûìè è íå çàíèìàþò ìåñòà íà äèñêå, ïîêà êòî-íèáóäü íåïðîèçâåäåò îïåðàöèþ çàïèñè.12.412.4.1Ôàéëû óñòðîéñòâ è êëàññèôèêàöèÿ óñòðîéñòâÎáîáùåííîå ïîíÿòèå ôàéëàÎäíèì èç çàìå÷àòåëüíûõ ñâîéñòâ ÎÑ Unix ÿâëÿåòñÿ îáîáùåííàÿ êîíöåïöèÿ ôàéëà êàê óíèâåðñàëüíîé àáñòðàêöèè. Ïðàêòè÷åñêè ëþáîå âíåøíåóñòðîéñòâî ïðåäñòàâëÿåòñÿ íà ïîëüçîâàòåëüñêîì óðîâíå êàê ôàéë ñïåöèàëüíîãî òèïà. Ýòî êàñàåòñÿ, â ÷àñòíîñòè, è æåñòêèõ äèñêîâ, è âñåâîçìîæíûõ ïîñëåäîâàòåëüíûõ è ïàðàëëåëüíûõ ïîðòîâ, è âèðòóàëüíûõ òåðìèíàëîâ, è ò.ï..Òàê, ÷àñòî âîçíèêàåò çàäà÷à ñîçäàíèÿ îáðàçà êîìïàêò-äèñêà (CD).
Òàêîå ìîæåò ïîòðåáîâàòüñÿ, íàïðèìåð, ïðè ñîçäàíèè êîïèè äèñêà.  íåêîòîðûõäðóãèõ îïåðàöèîííûõ ñèñòåìàõ äëÿ ïðîâåäåíèÿ òàêîé îïåðàöèè íåîáõîäèìîñïåöèàëüíîå ïðîãðàììíîå îáåñïå÷åíèå. ×òî êàñàåòñÿ ÎÑ Unix, òî òóò îáû÷íîäîñòàòî÷íî âñòàâèòü äèñê â ïðèâîä è äàòü êîìàíäócat /dev/cdrom > image.isoÒî÷íî òàê æå, ÷òîáû, ñêàæåì, îòïðàâèòü ôàéë íà ïå÷àòü, äîñòàòî÷íî êîìàíäûcat myfile.ps > /dev/lp0Êîíå÷íî, îáû÷íî òàê íå äåëàþò, ïîëàãàÿñü íà ïîäñèñòåìó ïå÷àòè, îäíàêî íàìâ äàííîì ñëó÷àå âàæíåå ñàì ôàêò òàêîé âîçìîæíîñòè.82Äåëî â òîì, ÷òî òàêîé ïîäõîä ïîçâîëÿåò îñóùåñòâëÿòü ðàáîòó ñ óñòðîéñòâàìè â îñíîâíîì ñ ïîìîùüþ òåõ æå ñàìûõ ñèñòåìíûõ âûçîâîâ, ÷òî è ðàáîòóñ îáû÷íûìè ôàéëàìè.
Òàê, ÷òîáû çàïèñàòü èíôîðìàöèþ â îïðåäåëåííûé ñåêòîð æåñòêîãî äèñêà, â äðóãèõ îïåðàöèîííûõ ñèñòåìàõ òðåáóåòñÿ îáðàòèòüñÿ êñèñòåìíîìó âûçîâó, ñïåöèàëüíî ïðåäíàçíà÷åííîìó äëÿ çàïèñè ñåêòîðîâ ôèçè÷åñêîãî äèñêà.  ÎÑ Unix äîñòàòî÷íî îòêðûòü íà ÷òåíèå ñïåöèàëüíûé ôàéë,ñîîòâåòñòâóþùèé íóæíîìó äèñêó, ñ ïîìîùüþ âûçîâà lseek() ïîçèöèîíèðîâàòüñÿ íà íóæíûé ñåêòîð è âûäàòü îáû÷íûé write().
Èìåííî òàê îñóùåñòâëÿåòñÿ, íàïðèìåð, âûñîêîóðîâíåâàÿ ðàçìåòêà (ôîðìàòèðîâàíèå) äèñêîâ.Òî÷íî òàê æå, íàïðèìåð, ïðè ââîäå çâóêîâîãî ñèãíàëà ñ ìèêðîôîíà ìîæíî îòêðûòü íà ÷òåíèå ôàéë, ñîîòâåòñòâóþùèé çâóêîâîìó óñòðîéñòâó, è ïðîèçâåñòè ÷òåíèå. Åñëè ïðî÷èòàííóþ èíôîðìàöèþ çàòåì çàïèñàòü îáðàòíî âçâóêîâîå óñòðîéñòâî, çâóê áóäåò âîñïðîèçâåäåí.Íàäî îòìåòèòü, ÷òî íåêîòîðûå ïåðèôåðèéíûå óñòðîéñòâà ìîãóò è íå èìåòüôàéëîâîãî ïðåäñòàâëåíèÿ. Íàïðèìåð, íå âî âñåõ ÎÑ ñåìåéñòâà Unix ñóùåñòâóþò ôàéëû, ñâÿçàííûå ñ ñåòåâûìè èíòåðôåéñàìè.12.4.2Äâà òèïà óñòðîéñòâÓñòðîéñòâà, äëÿ êîòîðûõ èìååòñÿ ïðåäñòàâëåíèå â âèäå ôàéëà, äåëÿòñÿ íàäâà òèïà: ñèìâîëüíûå (èëè ïîòîêîâûå ) è áëî÷íûå.