Үрдістер және олардың арасындағы қатынастар

Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 3

1. Үрдістер және олардың арасындағы қатынастар ... ... ... ... ... ... ... ... ...4
2. Аталған және аталмаған арналарға кіріспе ... ... ... ... ... ... ... ... ... ... ... .4
2.1. Арналар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .5
2.2. Арна құру ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..6
2.3. Қосымша үрдіске арна ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .6
2.4. pipe жүйелік функциясы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..6
2.5. Аталған арнаны ашу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .8
2.6. Программалық арналар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 8
3. FIFO арнайы файлдар. «Құбырлар» ... ... ... ... ... ... ... ... ... ... ... ... ... ..12
4. Арналармен жасалатын операциялар ... ... ... ... ... ... ... ... ... ...17
4.1. Арналардан оқу және арналарға жазу ... ... ... ... ... ... ... ... ... ..17
4.2. Арналарды жабу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .19
4.3. Арнаның енгізу.шығаруының жылдамдығы ... ... ... ... ... ... ...21

Қорытынды ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..22
Пайдалынылған әдебиеттер тізімі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .23
Программалық тілдердің дамуына байланысты сәйкесінше нарыққа шығарылатын программалық қамтамалар мен қосымшаларға келтірілетін критерийлер де сәйкес жоғары дәрежелі программалық өнімдерді қажет етеді. Осы индустрияның дамуында операциялық жүйелер (ОЖ) де елеулі орын алады. ОЖ лердің түрлері күннен күнге өсіп бара жатқанына қарамастан бұл саланың негізгі қалыптасқан өзінің көшбасшылары бар. Бұған мысал ретінде көпшілік компьютерлерде қолданылатын Microsoft компаниясының Windows ОЖ-сін келтіруге болады. Ол көпшілік қолданушылардың қолдауын тапқан және әлемдік программалық қамтамалар нарығында жетекші орындардың бірін алады.
Unix ОЖ-сі де осы Microsoft фирмасының өніміне бір бәсекелес ретінде қарастырылады. Себебі бұл ОЖ-нің мүмкіндіктері жүйелік операцияларды жасауда кең ауқымға ие болады.
Бұл курстық жұмыста Unix ОЖ-сінің үрдістер арасындағы қатынастарды құруға арналған арналары жайлы мәселе қозғалады. ОЖ мәнінің өзі әрқилы үрдістерді ұйымдастыру болғандықтан да бұл тармақтың маңызды екеніне күмән жоқ. Сондықтан Unix ОЖ-сінің қызықты әрі пайдалы мүмкіндіктерін барынша терең қарастырайық.
1. М.Банахан, Э.Раттер. Введение в операционную систему UNIX. - М.: Радио и связь, 1986.
2. С.Баурн. Операционная система UNIX. - М.: Мир, 1986.
3. П.Браун. Введение в операционную систему UNIX. - М.: Мир, 1987.
4. M.Bach. The design of the UNIX operating system. - Prentice Hall, Englewood Cliffs, N.J., 1986
        
        Мазмұны
Кіріспе.....................................................................
.......................................3
1. Үрдістер және олардың арасындағы
қатынастар...................................4
2. Аталған және аталмаған арналарға
кіріспе.............................................4
2.1.
Арналар.....................................................................
....................5
2.2. Арна
құру........................................................................
..............6
2.3. ... ... pipe ... Аталған арнаны
ашу.....................................................................8
2.6. Программалық
арналар................................................................8
3. FIFO арнайы файлдар.
«Құбырлар»......................................................12
4. Арналармен жасалатын операциялар…………………………………17
4.1. Арналардан оқу және ... ... ... ... ... тілдердің дамуына байланысты сәйкесінше нарыққа
шығарылатын программалық қамтамалар мен қосымшаларға келтірілетін
критерийлер де сәйкес ... ... ... өнімдерді қажет етеді.
Осы индустрияның дамуында операциялық жүйелер (ОЖ) де елеулі орын алады. ОЖ-
лердің түрлері күннен ... өсіп бара ... ... бұл ... ... өзінің көшбасшылары бар. Бұған мысал ретінде көпшілік
компьютерлерде ... ... ... Windows ... болады. Ол көпшілік қолданушылардың қолдауын тапқан және әлемдік
программалық қамтамалар нарығында жетекші орындардың бірін алады.
Unix ... де осы ... ... өніміне бір бәсекелес ретінде
қарастырылады. Себебі бұл ОЖ-нің мүмкіндіктері жүйелік операцияларды
жасауда кең ауқымға ие болады.
Бұл ... ... Unix ... үрдістер арасындағы қатынастарды
құруға арналған арналары жайлы мәселе ... ОЖ ... өзі ... ұйымдастыру болғандықтан да бұл тармақтың маңызды екеніне күмән
жоқ. Сондықтан Unix ОЖ-сінің ... әрі ... ... барынша
терең қарастырайық.
1. Үрдістер және олардың арасындағы қатынастар
Бұл жерде Unix операциялық жүйесінде үрдістер ... ... ... Бұл үшін бізге төменде көрсетілген екі ... ... ... Бұл файлдық дескрипторларды дубльдеу функциялары.
int dup(fd); int dup2(fd, ... fd; int fd, ... ... ... ... ... ашылған файлдың файлдық
дескрипторы болып табылады. Бұл функция сәтсіз аяқталған жағдайда -1 мәнін
қайтарады, ал ... ... ... 0-ден ... ... оған тең ... Функцияның негізгі қызметі файлдық дескрипторды белгілі бір
бос файлдық дескрипторға көшіру болып ... Яғни ашық ... ... ... ... fd файлдық дескрипторын белгілі бір to_fd ... ... ... Бұл ... бұл ... сұраныс берілген
жағдайда біз көшіргелі тұрған файлдық дескриптор бос ... бұл ... ... ... файл ... және ... дескриптор қайта
анықталады.
Мысал:
int fd;
char s[80];
fd = ... a.txt ... тек оқу үшін ғана ... Осы ... ... ... дескриптор fd-да сақталып тұр. Содан ... dup2 ... ... ... ... a.txt файлымен
жұмыс жасау үшін үрдістің стандартты енгізуі ауыстырылады. ... соң ... ... ... gets ... a.txt ... ... қатарды
оқиды. Көрініп тұрғандай қайта анықтау оншалықты қиын жұмысқа жатпайды.
2. Аталған және аталмаған арналарға кіріспе
Аталмаған арналар – 1973 жылы ... ... ... ... ... ... формасы. Көп жағдайдағы падалылығына қарамастан аталмаған
арналардың ... ... ... ... ... ... әсерінен олар тек
туыстас үрдістер қатынасы үшін ғана ... ... Бұл ... ... III-те кейде аталған арналар деп аталатын FIFO каналдарын қосу
арқылы түзетілген еді. ... және ... ... ... құру ... read және write ... қолданылады.
Ескерту. Программалық арналарға бір-біріне дескриптор беру
мүмкіндіктерін берсек, олар ... емес ... ... ... Бірақ практикада бұл араналар ... ... бар ... ... құру үшін қолданылады.
2.1. Арналар
Арналар үрдістер арасында түсу ретіне байланысты («бірінші кірген ... ... ... мүмкіндік береді. Оларды ... ... ... ... бары белгісіз болған жағдайға қарамастан үрдістерге
бір-бірімен әрекеттесуге мүмкіндік береді. Арналардың үйреншікті ... ... үшін ... ... ... ... екі ... аталған арналар және аталмаған ... Олар ... ... ... ... ... жағынан бір-біріне ұқсас ... ... ... үшін үрдістер open жүйелік функциясын, ал аталмаған
арналар үшін pipe ... ... ... ... ... жұмыс
кезінде үрдістер әдеттегі read, write және close ... ... ... қолданады. Тек pipe функциясын шақырған үрдістің туыстастары
болып табылатын бір-бірімен ... ... ғана ... ... ... өз ... бөле алады. Мысалға, егер В үрдісі арна ... және Е ... ... бұл үш ... өз ... ... ... алады. Бірақ барлық үрдістер аталған ... ... ... және тек ... ... ... ... болған жағдайда қатынас құра алады.
Арна – үрдістер арасында байланыс құру ... ... ... ... ... ... ... мәліметтер басқа үрдіс арқылы оқылуы мүмкін .
Мәліметтер «бірінші кірген бірінші шығады» кезегінде оңделеді (FIFO). ... атқа ие ... ол бір рет ... үшін құрылған және оның екі
ұшы ... ... ... ... мұра ... ... FIFO арқылы байланыс құруы үшін оны аты бойынша ашады.
Арна немесе FIFO бір уақытта екі ұшынан да ашылуы тиіс. Егер сіз ... ... ... ... FIFO ... оқып ... оқу ... соңын
қайтарады. Оқылу үрдісіне болмайтын арнаға немесе FIFO-ға жазу қате шарты
ретінде өңделеді; бұл ... SIGPIPE ... және EPIPE қате ... сигнал
өңделген немесе бұғатталған болса генерациялайды.
Арналар да, FIFO арнайы файлдары да файлды позициялауға ... ... да, жазу да ... ... файл ... оқу және соңына жазу.
2.2. Арна құру
Арна құру үшін қарапайым операция – pipe функциясы. Ол арна ... да, ... да ... етеді. Бұл жағдай бірлік үрдіс үшін ыңғайсыз
келеді, себебі бұл жағдайда ол ... өз ... ... құру үшін
пайдаланады. Қарапайым қолдану кезінде ... ... ... ... ... алдын құрады. Арна аталық және балалық үрдістер
арасындағы ... екі ... ... ... байланыс ретінде
қолданылады.
pipe функциясы 'unistd.h' ... ... ... pipe (int ... ... ... ... құрады және оқу және жазу үшін файл ... [0] және filedes [1]-ге ... ... ... pipe 0 ... қайтарады. Ал керісінше жағдайда
-1 қайтарылады. Келесі қатенің errno шарттары бұл функция үшін төмендегідей
анықталған:
EMFILE
үрдіс аса көп ашық файлдарды ... ... ... аса көп ашық файлдар бар.
2.3. Қосымша үрдіске арна
Арналардың жалпы қолданылуы мәліметтерді қосымша ... ... ... ... ... немесе оған жіберуі тиіс.
Мұны орындаудың тәсілдерінің бірі – келеісі комбинацияны қолдану: pipe
(каналды құру үшін), fork ... ... құру ... dup2 ... үрдіске
pipe-ті шығару арнасы немесе стандартты енгізу ретінде қолдануға нұсқау
беру үшін) және exec ... ... ... ... ... popen ... ... болады.
2.4. pipe жүйелік функциясы
Арна құру функциясын шақырудың синтаксисі:
pipe(fdptr);
, мұндағы fdptr – екі бүтін санды ... ... ... ... ... оқу үшін және ... жазу үшін ... файлдың екі
дескрипторы сақталатын болады. Ядро арналарды файлдық жүйе ... және арна оны ... ... жүйеде болмағандықтан ядро
арнаны құрған кезде оған индекс жариялауы тиіс. Ол және де арна үшін ... ... ... және ... ... ... ... жазбаларды жариялайды. Ядро файлдар кестесін қолданғандықтан
read, write және т.б. функцияларды шақырудың ... ... ... сәйкестендіріліп орындалады. Нәтижесінде үрдістердің оқу
немесе жазуды қарапайым файл ... ... ... ... ... ... Pipe алгоритмі ... ... жоқ ... ... жазу үшін файл ... ... үшін файл ... |
|{ ... ... жаңа ... ... ... ... ... бір ... оқу ... бірін –қайта жазу үшін ... ... ... ... олар жаңа индекске көрсетіп тұратындай |
|етіп инициалдау; ... бір ... ... оқу ... ... ... жазу үшін |
|белгілеу, оларды файлдар кестесінде сәйкес кіру ... ... ... етіп ... ... ... ... мәнін 2-ге тең етіп орнату; ... және ... ... ... ... санын санаудың санағышының |
|мәнін 1 етіп қою; |
|} ... ... ... ... ... ... арналар құру алгоритмі көрсетілген. Ядро ... ... ... «арна құрылғысы» ретінде белгіленген индексті ialloc
алгоритмін қолдану арқылы жариялайды. Арна құрылғысы – бұл ядро ... ... ... және мәліметтер үшін блоктарды белгілейтін
файлдық жүйе болып табылады. Жүйе ... арна ... ... ... көрсетеді және бұл құрылғылар әр түрлі файлдық
жүйелерде сәйкес ... ... Арна ... болып тұрғанша ядро арна
индексін және ... ... ... ... ... ... ... соң ядро файлдар кестесінде арнаға жазу және оқу ... ... екі ... ... және ... индекс көшірмесіндегі
тіркеушілік мәліметтерді түзетеді. Файлдар кестесіндегі әрбір белгіленген
жазбада арнаның неше экземпляры оқу немесе жазу үшін ашық ... ... ... ... ... ал ... ... санағышы арна неше
рет ашылғанын (бастапқыда 2) ... ... ... арна ... ығысуы енгізу немесе шығарудың ендігі операциясы басталатын жерге
дейін жазылады. Осы ығысуларды ... ... ... арнадағы
мәліметтерге қатынауды олардың арнаға келіп түсу ретімен ... ... жер ... ... ... береді, себебі қарапайым файлдар
үшін ығысулар файлдар кестесінде сақталады. Үрдістер бұл ығысуларды lseek
функциясының ... ... ... ... арна ... ... ... емес.
2.5. Аталған арнаны ашу
Аталған арна – бұл аталмаған ... ... ... ... ... ... ... Бірақ бұл файлға каталогтағы жазба сәйкес келеді және ... аты ... аты ... ... ... ... ... файлдар сияқты ашады және осыған сәйкес аталған арналар көмегімен
бір-біріне мүлдем қатыссыз үрдістер қатынас құруы мүмкін. Аталған ... жүйе ... ... түрде болады (ол жерден олар ... ... ... ... ал аталмаған арналар уақытша болып
табылады: барлық үрдістер арнамен ... ... соң ядро ... ... алып қояды.
Аталған арнаны ашудың алгоритмі қарапайым файлды ... ... ... ... та функциядан шығып кетудің алдында ядро аталған арнаны оқу
немесе жазу үшін ... ... ... ... ... ... ... Аталған арнаны оқу үшін ашатын үрдіс өз ... ... ... арнаны жазу үшін ашпағанша тоқтата тұрады және керісінше.
Үрдіс мәліметтерді ... ... ... оқу үшін ... ... ... ... оқу немесе жазу үшін ашып жатқанына байланысты ядро ... ... ... жұмысын қайта бастайды.
Егер үрдіс аталған арнаны оқу үшін ашып ... және ... ... ... бар
болса, онда ашу тоқтатылады. Немесе егер үрдіс «no delay» ... ... ... ашып жатса, онда бірде-бір жазу үрдісі болмаған жағдайда да
open функциясы басқаруды дереу қайтарады. Барлық ... ... ... ... ... ашпағанша үрдіс тоқтатылып тұрады. Осындай ережелер
арнаны жазу үшін ашып ... ... үшін де ... ... ... ... жайлы бірнеше сөз. Бізде екі үрдіс болсын және осы
екі үрдіс арасында бір ... ... ... ... ... ... қатынас құру қажет. Unix ... бұл ... ... ... жағынан қарастырған жағдайда арна екі
дескрипторға ие белгілі бір ұғым ... ... Бір ... ... үрдіс арнаға мәліметтерді енгізе алады, ал екіншісі арқылы оларды
арнадан оқи алады. Арна ... ... ... ... ... ... ... берілуі мүмкін. Бұл жағдай екі туыстас
үрдістің ортақ арнаны ... ... ... ... Яғни бір үрдіс
белгілі бір ... ... ... ... дәл сол арнадан ол
мәліметтерді оқи алады.
Арнамен жұмыс ... ... Арна ... ... ... үшін ... ... белгіленген қоры бөлінеді.
Кейбір жүйелерде бұл ... ... ... ... ... ... арнаға
мәлімет енгізгісі келіп, буфер ... ... ... ... буферде
мәліметтер болмаған жағдайда арнадан мәліметті оқуға тырысқан жағдайда
қандай жағдай орын алады? Екі ... да ... ... ... ... орын босамағанша немесе арнада мәлімет пайда болмағанша күтеді. ... ... ... ... ... ... өзгеріп тұруы
мүмкін. Ол параметрлерді программалық түрде өзгертуге болады.
Бұл концепциялардың орындалуын ... ... ... pipe
функциясы бар. Бұл функцияның аргументі екі бүтін мәнді айнымалыдан тұратын
массивке нұсқағыш болуы тиіс.
int pipe(pipes);
int ... ... ... pipe ... ... соң оқу ... дескрипторды алады. Бұл массивтің бірінші элементі жазу ... ... ... Бос ... дескрипторлар болмаған жағдайда бұл
функция -1 қайтарады. Оқитын дескриптор үшін файл ... ... ... ... ... ... дескрипторлар жабылмағанша алынбайды.
Кішігірім мысалды қарастырайық:
char *s = “Мысал”;
char b[80];
int pipes[2];
pipe(pipes);
write(pipes[1],s, strlen(s)+1);
read(pipes[0],s, strlen(s)+1);
Бұл қатарды көшіру мысалы ... ... ... қатарларды мұндай
көшіру қолданылмайды және pipe функциясын ешкім бір үрдіс шеңберінде
қолданбайды). Осы және ... ... ... ... бермеу
жағдайлары өңделмейді. Ендігі кезекте ... ... ... екі ... ... және оларды арна арқылы ... ... ... /* ... ... арнаның екі дескрипторын құрамыз */
if (fork()) /* дәл сондай дескрипторларға ие балалық үрдісті құрамыз */
{ /* программаның бұл бөлігі аталық ... ... ... /* ... шығаруды арнаға шығарумен алмастырамыз */
close(fd[1]); /* арна дескрипторларын ... ... /* енді ... шығару тек арнаға орындалатын болады */
execl(“/bin/ls”,“ls”,(char*)0); /* аталық үрдіс ... ... */
} /* бұл ... ... ... өз ... ... */
dup2(fd[0],0); /* балалық үрдісте барлығын жоғарыдағыдай етіп жасаймыз
*/
close(fd[0]);
close(fd[1]);
execl(“/bin/wc”,“wc”,(char*)0);
}
Бұл мысал конвейер арқылы екі команданы – ls және wc-ді ... ... ... ... ... ал wc қатарлар санын санайды.
Жоғарыдағы программаның орындалуының нәтижесі ls ... ... саны ... ... ... ls ... ... Барлық шығыс ақпаратты ls каналға
жүктейді, себебі стандартты шығару құрылғысы арнамен ... ... ... ... wc ... ... Ол ... стандартты енгізу
құрылғысы (яғни wc ... ... қор) ... оқу ... Бұл жағдай ls-тің өз стандартты шығару құрылғысына барлық
жазған ақпаратының wc командасының стандартты енгізу ... ... ... ... арна ... ... ... үшін және оқитын
дескриптор файл соңының белгісін алуы үшін ... ... ... ... Егер де біздің программада белгіленген қатар көрсетілменген
болғанда wc-мен байланысқан үрдіс ... ... еді, ... бұл ... ... ... файл соңынының белгісін ала алмайды. Ол белгіні
шексіз көп уақытқа ... күте ... ... ... ... ... де болатын еді, себебі дескриптор үрдістің аяқталуымен бірге
жабылатын еді. Ал ... ... ... ... ... ... Яғни бұдан
шығатын қорытынды жұмысты аяқтағаннан ... ... ... ... ... ... ... арқылы тек туыстас үрдістерді байланыстыруға болады. Техникалық
түрде ... ... ... ... байланыстыруға болады, бірақ бұл
жағдайда ... ... ... ... ... Unix-тің барлық версияларында бар. Арна pipe
шақыруымен құрылады және бір ... ... ... ... ...
int pipe(int ... аяқталған жағдайда 0, қате жағдайда -1 қайтарады*/
Функция екі файлдық дескрипторды: fd[0] және fd[1]-ді қайтарады. ... оқу ... ал ... жазу үшін ... ... ... версиялары, атап өткенде SVR4 екі жақты
арналарды (full-duplex pipes) ... Бұл ... арна екі ... да ... ашық ... ... Екі жақты IPC арнасын құрудың ендігі бір тәсілі
socketpair функциясын шақыру болып ... Оны ... UNIX ... ... болады. Бірақ көп ... ... ... ... жасаған кезде қолданылады. Бұл ... бір ... ... ... болады.
Дескриптор (файл, программалық канал немесе FIFO) типін анықтау үшін
S_ISFIFO макросын қолдануға болады. Ол жалғыз stat ... ... ... қабылдайды және «шынайы» (нөлге тең емес) немесе ... ... ... ... үшін stat құрылымын fstat функциясы
қайтарады. FIFO үшін құрылым fstat, lstat және stat ... бір ... ... ... ... ол тек осы үрдіспен
ғана өте сирек қолданылады. Әдетте арналар екі үрдіс арасында (аталық ... ... құру үшін ... ... ... арнаны құрады, ал
содан соң fork-ті өзінің көшірмесі – балалық үрдісті құру үшін шақырады.
Осыдан ... ... ... ... оқу үшін ашылған ұшын, ал өз ... ... жазу үшін ... арна ұшын ... Бұл ... ... мәліметтерді бір бағытты жіберуге жағдай жасайды. Мысалы:
Who | sort | lp
командасына ... ... ... ... ... ... ... аталған іс-қимылдарды арасында екі
арнасы бар үш үрдісті құру үшін орындайды. Бұдан ... ... ... ... әрбір арнаның ұшын стандартты енгізу ағынына, ал жазу үшін
ашылғанын – ... ... ... қосады.
Жоғарыда қарастырылған арналардың барлығы бір ... ... тек бір ... ... ... ... еді. ... жаққа жіберу керек болған жағдайда мәліметтерді бір жаққа ... ... жұп ... құру ... Екі ... бағытталған IPC арналарын құрудың
кезеңдері келесідей:
1. 1 (fd1[0] және fd1[1]) және 2 (fd2[0] және fd2[1]) ... ... ... Аталық үрдіс оқуға ашылған 1 (fd1[0]) арнасының соңын жабады.
4. ... ... ... ... 2 (fd2[1]) ... ... ... Балалық үрдіс жазуға ашылған 1 (fd1[1]) арнасының соңын жабады.
6. Балалық үрдіс оқуға ... 2 (fd2[0]) ... ... ... ... ... ... мәтіні төмендегі мысалда
көрсетілген.
Мысал
Төменде арналарды қолданып, жоғарыдағы аталған әрекеттерді орындайтын
программа келтірілген. main функциясы екі арна ... және ... ... үшін ... ... Бұл ... аталық үрдіс клиент, ал ... ... ... қалыптасады. Бірінші арна толық атты клиенттен серверге
беру үшін, ал ... файл ... ... қате ... ... ... беру үшін қолданылады.
//pipe/mainpipe.c
1 #include “unpipc.h”
2 void client (int, int), server (int, ... ... main (int argc, char ... {
6 int ... pipe2[2];
7 pid_t ... ... /*екі ... ... ... if ((childpid=Fork())==0) /*child*/
{
11 ... ... ... ... }
16 ... ... ... client(pipe2[0],pipe1[1]);
20 ... NULL, 0); ... ... күту*/
21 exit(0);
22 }
3. FIFO ... ... ... ... ... арнаға ұқсас келеді, бірақ ол әр түрлі жолдармен құрылуы
мүмкін. Белгісіз байланыс арнасының орнына FIFO арнайы файл файлдық ... ... ... ... ... ... ... жолмен құрылған болса, кез келген үрдіс оны оқуға
немесе жазуға қарапайым файлды сияқты аша алады. Алайда оған жазу ... ... ... ол бір уақытта екі жағынан да ашылуы ... ... ... ашу ... ... дәл сол ... жазу үшін оны ... бұғатталады
және керісінше. .
Mkfifo функциясы 'sys/stat.h' тақырыптық файлында жарияланған.
int mkfifo (const char *filename, mode_t mode) ... ... FIFO ... ... filename атын қойып құрады. mode
аргументі файл құқықтарын ... үшін ... ... ... ... қайтарылатын мән 0-ге тең. Қате анықталған
жағдайда -1 қайтарылады. Әдеттегі синтаксистік қателерге қоса ендігі ... ... бұл ... үшін анықталған:
EEXIST
аталған файл бұл уақытта құрылып қойған.
ENOSPC
каталог ... ... жүйе ... ... емес.
EROFS
файлды сақтайтын каталог файлдық жүйеде әр уақытта оқу үшін ... ... ... ... ... ... ... мүмкін.
Ерекше қасиеттерге ие файлдар белгілі. Олардың қатарына кезек секілді
орындалатын FIFO-файлдар (first in, first out) да ... ... оқу ... ... ажыратылған. Мұндай файлмен жұмыс шарларды құбыр арқылы
өткізуге ұқсас келеді – бір жағынан ... ... ал ... олар ... Бос ... оқу ... read шақыруын FIFO-
файлға қандай да бір ... ... ... ... lseek()
нұсқағышты позициялау операциясы FIFO-файлдарға қолданыла алмайды. ... ... ... ... арқылы құрылады
#include
#include
mknod( файлАты, S_IFIFO | 0666, 0 );
, мұндағы 0666 – файлға қатынау кодтары. FIFO-файл көмегімен ... ... ... ... ... бір түрі аталмаған FIFO-файл болып табылады. Ол аталық үрдіс
пен балалық үрдіс арасында мәліметтер алмасуға ... ... файл ... ... ... ... ... pipe деп аталады. Ол pipe
шақыруымен ... conn[2]; ... ... PIPEFILE ... ие ... pipe шақыруын келесі түрде
орындауға ... ... S_IFIFO | 0600, ... = ... O_RDONLY);
conn[1] = open("PIPEFILE", O_WRONLY);
unlink("PIPEFILE");
fork-ті шақыру кезінде екі үрдістің әрқайсысына мұра ретінде бір ... ... A ... B
А ... ... В ... ... болсын. Онда А үрдісі
close(conn[0]);
// т.к. не собирается ... ... ... ... В ... ... себебі ештеңе жазуды орындағалы тұрған жоқ
read (conn[0], ... );
Нәтижесінде келесіні аламыз:
conn[1]---->----FIFO---->-----conn[0]
үрдіс A ... ... А ... ... conn[1] ... (conn[1], 1); close(conn[1]);
write(1, ... ); /* или printf */
, ал В ... ... conn[0] ... қайта бағыттайды
dup2(conn[0], 0); close(conn[0]);
read(0, ... ); /* или gets */
Бұл СиШелл тілінде ... ... ... ... келеді
$ A | B
pipe үшін бөлінетін файл шектеулі ... ие ... ... ... ... сақталады). Ол толығымен толғаннан соң write шақыруы
арқылы құбырға ... ... ... ... бос орын пайда ... ... ... Бұл ... ... жағдайға әкелуі мүмкін. А үрдісі ... ... ... ... және В ... conn[0] арнасын жаппастан wait
шақыруын орындасын. Ал А үрдісі conn[1] құбырына аса көп мәлімет енгізсін.
Осы жағдайда біз екі ... ... ... ... ... ... аса ... ал В үрдісі А үрдісінің аяқталуын күтіп
тұрғандықтан одан еш нәрсе ... ... А ... ... ... ал ол ... мәліметін жазып
болмағанша аяқталмайды.
Бұл жағдайдың шешімі келесідей: В үрдісіне ол ... ... оқып ... (EOF алмағанша) wait шақыруын орындауға ... Тек ... соң ... ... В ... wait ... алады.
Егер В үрдісі құбырдың өз жағын А үрдісі оған жазуды ... ... ... close(conn[0]), онда А үрдісінде write ... ... А ... SIGPIPE ... яғни ... ... ... жазу орындау» жібереді.
FIFO файлдың ашылуы FIFO-файлдың буфері бос болғанда үрдістің бұғатталуына
(«ұйқыға кетуіне») әкеліп ... ... open ... ... буферде
бір нәрсе пайда болғанға дейін «ұйқыға кетеді».
Мұндай жағдайды ... үшін ... оны ... ... ... сұраныс
жіберу қажет. Бұл open шақыруында O_NDELAY ... ... ... fd = ... ... open ... ішінде үрдістің бұғатталуына әкелетін болса, оның орнына
(-1) мәні қайтарылатын болады. Егер де файл ... ... ... дайын болса, >=0 мәніне тең дұрыс дескриптор қайтарылады және файл
ашылады.
O_NDELAY ашылып жатқан файл семантикасына байланысты болады. ... ... ... яғни мысалы тізбекті порттарға апаратын аттармен
қатар қолдануға болады. Бұл ... ... ... ... тек ... аша ... ... ие (бұл құрылғылардың драйверлері ішінде open
функциясы ... ... ... егер бір ... ... ... ... болса, ал осы уақытта екіншісі оны ашуға ... ... open ... ... кетеді» және бірінші үрдістің close портын
босатуын күтіп тұрады. Мұндай ... ... үшін ... ... ашу ...
#include
/* Енді қажет емес O_NDELAY алып тастау */
void nondelay(int fd){
fcntl(fd, F_SETFL, ... F_GETFL, 0) & ... main(int ac, char ... fd;
char *port = ac > 1 ? "/dev/term/a" : ... if((fd = ... ... < ... ... %s ашық.\n", port);
nondelay(fd);
printf("Портпен жұмыс жасау!\n");
sleep(60);
printf("Соңы.\n");
return 0;
}
Жұмыс жасаудың нәтижесі ... a.out & a.out ... ... ... ... жұмыс жасау!
/dev/cua/a: Device busy
/dev/cua/a: Device busy
/dev/cua/a: Device busy
/dev/cua/a: Device ... Device ... Device ... ... ... жұмыс жасау!
su#
4. Арналармен жасалатын операциялар
4.1. Арналардан оқу және арналарға жазу
Арнаны қарастырғанда үрдістер арнаның бір ... жазу ... ... жағынан мәліметтерді оқып жатады деп түсінген жөн. Жоғарыда айтылып
кеткендей үрдістер арнадағы ... ... ... ... түсу ... қатынасады; бұл жағдай мәліметтер арнаға келіп түскендегі рет
олардың арнадан оқылу ... ... ... білдіреді. Арнадан
мәліметтерді оқитын үрдістер мен арнаға мәліметтерді енгізетін ... ... ... ... ... егер бір сан ... 1-ден көпке
ажыратылса, онда үрдістер арнаны қолданудағы өз ... ... ... ... ... Ядро ... ... файлдағы мәліметтерге қатынасқандағыдай ... ... арна ... ... және write ... ... арнаға керекті блок санын жариялайды. Арна және қарапайым файл үшін
жады ... ... ... ... ... ... жоғарылату
мақсатында тек тура адрестеу блоктарын қолдануында жатыр. Бұл жағдай арнаға
бір уақытта ... ... ... ... ... ... қояды.
Ядро индекстің тура адресациялау блоктарымен циклдік кезек ... ... яғни өз ... ... ... бірінші шықты» ретін орындау
үшін оқу және жазу нұсқағыштарын қолдап отырады.
Арнаға енгізу-шығарудың төрт ... ... ... жазу ... ... ... ... сұранысты қанағаттандыру үшін мәліметтері
жеткілікті арнадан оқу; мәліметтер жеткіліксіз арнадан оқу; ... орын ... ... ... ... ... Мұнда үрдіс мәліметтер енгізу үшін орын
жеткілікті болатын арнаға жазу енгізеді: жазылғалы байттар көлемінің ... ... ... қосындысы арна көлемінен кіші немесе соған тең. ... ... ... ... ... ... ол арна өлшемін
автоматты түрде write функциясының әрбір орындалуынан соң үлкейтіп отырады,
себебі анықтау бойынша арнадағы мәліметтер көлемі ... жазу ... ... өсіп ... ... ... файл көлемінің ұлғаюы
орындалады: үрдіс файл көлемін тек ол мәліметтерді жазу ... ... ... ... кезде ғана орындайды. Егер арнадағы келесі ығысу
тікесіз ... ... ... ... ... ядро ... ... мәнін арна басына көрсетіп тұратындай етіп ... ... 0-ге тең). Ядро еш ... ... ... өшірмейді;
ол ығысу мәнін 0-ге теңестіруі мүмкін, себебі ол мәліметтер арна ... ... асып кете ... ... Үрдіс өзінің барлық мәліметтерін
арнаға жазып болған соң ядро арна жазбасының нұсқағышының ... ... ... ... ... write ... тоқтаған жерден бастайтындай
етіп коррекциялайды. Содан соң ядро арнадан ... ... ... тоқтатылған барлық басқа үрдістердің орындалуын жаңадан
бастайды.
Үрдіс ... оқу ... ... ... ол арнаның бос не бос емес
екенін тексереді. Егер арнада ... ... ядро ... ... ... ... ... арқылы оқиды. Бірақ бастапқы ығысу
индексте сақталып тұрған оқу ... мәні ... ... және ол ... ... ... көрсетіп отырады. Әрбір блокты оқып
болғаннан соң ядро арна ... ... ... ... ... ... және үрдіс кеңістігіндегі ығысу мәнін арна соңына ... ол оның ... ... ... етіп орнатады. read жүйелік
функциясы ... ... соң ядро ... ... жазу үрдістерінің
орындалуын қайта бастайды және индекстегі оқу нұсқағышының ағымдағы мәнін
жадқа сақтап қояды .
Егер үрдіс арнадағы бар ... көп ... ... ... ... read
функциясы сол мезетте арнадағы бар ... ... ... ... ... қанағаттандырмағандығына қарамастан сәтті
аяқталады. Егер арна бос ... ... ... басқа бір үрдіс арнаға мәлімет
енгізбегенше тоқтатылып тұрады. Содан соң ... ... ... ... үрдістер өз жұмыстарын қайта жандандырады және арнадан оқу
үшін бәсекеге ... ... та егер ... «no delay» ... ... ... арнаны ашса, арнада мәліметтер жоқ жағдайда read ... ... ... ... арнаға жазуды орындап жатқан болса және арнада барлық мәліметтер
үшін орын ... ... ядро ... ... және ... ... ... үрдісті тоқтата тұрады. Бұдан әрі
басқа үрдіс ... ... ... орындаған кезде ядро арнаның
тазартылуын күтіп тұрған үрдістердің барлығын анықтадйды және ... ... ... Бұл ... ... ... ... арнаға көлемі
каналдың көлемінен үлкен мәліметтерді енгізген кезде ... ... ... ядро ... ... мәліметтерді енгізіп, үрдісті бос орын пайда
болатын уақытқа ... ... ... келесі жағдай орын ... ... ... арнаға жазба орындау уақыты бірінші үрдістің өз
жұмысын тоқтату уақытына сәйкес келсе, ... ... ... ... орынды алмайды.
арналардың орындалуын талдай келе үрдістер интерфейсі ... ... ... ... ... ... Алайда оның көрінісі
басқаша болады, себебі ядро оқу және жазу үшін ... ... ... ... сақтайды. Ядро аталған арналар үшін ығысулар
мәндерін индексте ... және бұл ... ... осы ... ... алуы үшін ... олар ... кестесіндегі мәндерді ортақ
пайдалана алмайтын еді, себебі үрдіс open функциясын әрбір шақыруынан ... ... жаңа ... ие ... ... ... ... оқу
және жазу ығысуларын ортақ пайдалану аталған арналардың шығуынан алдын ... ... ... ... ... ... ... қатынауды
файлдар кестесіне ортақ кіру нүктелері арқылы бөліседі. ... ... ... оқу және жазу ... ... ... еді. Бұл
мүмкіндіктерді оған ... ... ... ... жасайтын төменгі
деңгейлі процедуралар файлдар кестесіндегі жазбаларға ... құра ... ... ... ... ... ортақ пайдалануы себебінен
қарапайымданды.
4.2. Арналарды жабу
Арнаны жабарда үрдіс қарапайым файлды ... ... ... ... ядро арна ... босатудан алдын арнайы өңдеу өткізеді. Ол файлдық
дескриптордың типіне байланысты арнаға оқу немесе жазу ... ... Егер ... ... ... санағышының мәні 0-ге теңессе және
арнадан оқу үрдісін күтіп тұрып қалған үрдістер болса, ядро ... ... және олар ... оқу ... ... да ... ... аяқтайды. Егер арнадан ... ... мәні 0-ге ... және ... жазу ... күтіп тұрған
үрдістер бар болса, ондда ядро соңғыларын орындауды жалғастырады және
оларға қате ... ... ... Екі ... да егер арна күйі
өзгеріске ұшырауы жайлы үміт болмаса, ... ... ... ... ... егер ... ... арнадан оқудың мүмкіндігін күтіп тұрған
болса және жүйеде бұл ... ... ... жоқ ... жазатын үрдіс
ешқашан пайда болмайды. Арнаның аталған ... ... ... ... ... ... ... үрдістің пайда болуы мүмкін. Ядро бұл жағдайды
дәл аталмаған ... үшін ... ... Егер ... ... ... жазатын үрдіс сұраныс жібермесе, ядро ... ... ... ... және индексті арнаның бос екенін
көрсететіндей етіп ... ... Ядро ... ... ... ... ... бұл индекстің дискілік көшірмесін де қайта жариялау
үшін босатады.
Мысалдар
Төмендегі программа арналарды пайдаланудың мысалы ретінде келітірілген.
Үрдіс ... ... ... ... ... қатарын жазудың және оны
оқудың шексіз циклына кіреді. Бұл жерде ядро ... жазу ... ... ... үрдістің бір екенін байқамайды.
| char string[] |
|= "hello"; ... |
| |
|{ |
| ... ... ... ... ... fds[2]; |
| ... = string; ... = buf; ... ... = *cp1++; ... ... (;;) |
|{ ... ... |
|} |
|} ... оқу және арнаға жазу
Төменде келтірілген программаны орындайтын үрдіс «fifo» атты аталған ... Егер бұл ... ... ... ... ... ол арнаға
үздіксіз «hello» символдар қатарын жазады; төмендегіше екінші аргументсіз
жүктелген ... ... ... оқуды орындайды. Екі үрдіс өз араларында
«fifo» аталған арнасы арқылы ... ... ... келісімге келіп, бір
программа арқылы жүктеледі. Бірақ оларға ... ... ... ... ... ... ... орындай алады және
диалогқа қатысуы (немесе оған кедергі келтіруі) мүмкін.
| #include ... string[] = "hello"; ... ... argc; ... *argv[]; |
|{ ... fd; ... ... |
| ... ... ... үшін оқуға және жазуға рұқсат етілетін аталған ... құру */ ... ... == 2) ... = ... ... ... = open("fifo",O_RDONLY); ... (;;) ... == 2) ... ... ... |
|} ... ... енгізу-шығаруының жылдамдығы
Арнаға енгізу немесе шығару ... ... ... кіші ... дереу орындалады. Бұл жағдайда мәліметтерді беру лездік болып
көрінеді. Бұл жағдайда жүйеде еш нәрсе ол ... ... ... ... ... ... басталуы мүмкін емес (мәліметтер үшін буфер
кеңістігін күту қажет болуы ... ... ол ... ... ол ... ... ... енгізілуі немесе шығарылуы тез болмауы мүмкін;
мысалға, басқа үрдістердің дескрипторды ортақ пайдаланатын шығу мәліметтері
бірнеше бөлікке бөлінуі ... біз Unix ... ... ... ... арқылы қатынас
құру мүмкіндіктерін қарастырдық. Жоғарыдағы курстық жұмыстың Unix ОЖ-сінің
тек бір мүмкіндігі екендігін ескеретін болсақ, бұл ОЖ-нің өте ... ие ... ... ... тұр. ... ... ... бұл ОЖ өзіне
ұқсастардың арасындағы жетекші орынды алатыны тегін емес. Unix ОЖ-сі
жүйелік ОЖ-лер арасында қазірде жетекші орынды алып отыр.
Шығарылатын қорытынды: Unix ... өте кең ... ие және ... мүмкіндіктерін білу өте қиынға соғары сөзсіз. Соған қарамастан Unix
ОЖ-нің мүмкіндіктерін игеру қолданушының ... ... ... ... ... ... ... М.Банахан, Э.Раттер. Введение в операционную систему UNIX. - М.: Радио
и связь, 1986.
2. С.Баурн. Операционная система UNIX. - М.: Мир, ... ... ... в ... ... UNIX. - М.: Мир, ... M.Bach. The design of the UNIX operating system. - Prentice ... Cliffs, N.J., ...

Пән: Информатика
Жұмыс түрі: Реферат
Көлемі: 19 бет
Бұл жұмыстың бағасы: 300 теңге









Ұқсас жұмыстар
Тақырыб Бет саны
Тәрбие процесі туралы жалпы ұғым4 бет
Құқықтық қатынастардың түсінігі, белгілері және алғышарттары5 бет
«Оңтүстік Қазақстандағы татарлардың арасындағы этнотілдік үрдістер»26 бет
Ақпараттық технологиялар сұрақ-жауап түрінде30 бет
Биогеохимияның негізгі концепциялары (сұрақ-жауап түрінде)78 бет
Ес туралы теориялар8 бет
Жаһандану туралы ақпарат5 бет
Мұхтар әуезовтың «манас туралы» мақаласы. (конспект)7 бет
Сақ дәуірі тайпаларының шаруашылығы, тұрмысы және қоғамдық құрылысы14 бет
Қазақстан аумағындағы алғашқы көшпелілер және тайпалық одақтардың құрылуы10 бет


Исходниктер
Пәндер
Көмек / Помощь
Арайлым
Біз міндетті түрде жауап береміз!
Мы обязательно ответим!
Жіберу / Отправить


Зарабатывайте вместе с нами

Рахмет!
Хабарлама жіберілді. / Сообщение отправлено.

Сіз үшін аптасына 5 күн жұмыс істейміз.
Жұмыс уақыты 09:00 - 18:00

Мы работаем для Вас 5 дней в неделю.
Время работы 09:00 - 18:00

Email: info@stud.kz

Phone: 777 614 50 20
Жабу / Закрыть

Көмек / Помощь