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



Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 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. Қосымша үрдіске
арна ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..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 операциялық жүйесінде үрдістер қатынастарының әрқилы
тәсілдері көрсетілген. Бұл үшін бізге төменде көрсетілген екі жүйелік
функция қажет болады. Бұл файлдық дескрипторларды дубльдеу функциялары.
int dup(fd); int dup2(fd, to_fd);
int fd; int fd, to_fd;
dup функциясының аргументі берілген үрдісте ашылған файлдың файлдық
дескрипторы болып табылады. Бұл функция сәтсіз аяқталған жағдайда -1 мәнін
қайтарады, ал сәтті болған жағдайда 0-ден үлкен немесе оған тең нәтиже
қайтарылады. Функцияның негізгі қызметі файлдық дескрипторды белгілі бір
бос файлдық дескрипторға көшіру болып табылады. Яғни ашық файлды өзара
көшіруге болады.
dup2 функциясы fd файлдық дескрипторын белгілі бір to_fd нөмірлі
файлдық дескрипторына көшіреді. Бұл жағдайда бұл функцияға сұраныс берілген
жағдайда біз көшіргелі тұрған файлдық дескриптор бос болмаса, бұл файлдық
дескриптормен жұмыс жасайтын файл жабылады және файлдық дескриптор қайта
анықталады.
Мысал:
int fd;
char s[80];
fd = open(“a.txt”,O_RDONLY);
dup2(fd,0);
close(fd);
gets(s,80);
Программа a.txt файлын тек оқу үшін ғана ашады. Осы файлмен
байланысқалы тұрған файлдық дескриптор fd-да сақталып тұр. Содан соң
программа dup2 функциясына сұраныс жібереді. Нәтижесінде a.txt файлымен
жұмыс жасау үшін үрдістің стандартты енгізуі ауыстырылады. Содан соң fd
дескрипторын жабуға болады. gets функциясы a.txt файлынан кезекті қатарды
оқиды. Көрініп тұрғандай қайта анықтау оншалықты қиын жұмысқа жатпайды.

2. Аталған және аталмаған арналарға кіріспе

Аталмаған арналар – 1973 жылы Unix-тің үшінші версиясында шыққан IPC-
дің алғашқы формасы. Көп жағдайдағы падалылығына қарамастан аталмаған
арналардың басты кемшілігіне аттың жоқтығы жатады. Осының әсерінен олар тек
туыстас үрдістер қатынасы үшін ғана пайдалануы мүмкін. Бұл жағдай Unix
System III-те кейде аталған арналар деп аталатын FIFO каналдарын қосу
арқылы түзетілген еді. Аталған және аталмаған арналарға қатынау құру үшін
қарапайым read және write функциялары қолданылады.
Ескерту. Программалық арналарға бір-біріне дескриптор беру
мүмкіндіктерін берсек, олар туыстас емес үрдістер тарапынан пайдалануы
мүмкін. Бірақ практикада бұл араналар ортақ туыстасы бар үрдістер
арасындағы қатынасты құру үшін қолданылады.

2.1. Арналар

Арналар үрдістер арасында түсу ретіне байланысты (бірінші кірген бірінші
шығады) мәліметтер алмасуына мүмкіндік береді. Оларды қолдану арнаның
соңында қандай үрдістер бары белгісіз болған жағдайға қарамастан үрдістерге
бір-бірімен әрекеттесуге мүмкіндік береді. Арналардың үйреншікті орындалуы
мәліметтерді сақтау үшін файлдық жүйені қолданады. Арналардың екі түрі
ажыратылады: аталған арналар және аталмаған арналар. Олар үрдістердің
бастапқы сұранысының түрінен басқа барлық жағынан бір-біріне ұқсас болып
келеді. Аталған арналар үшін үрдістер open жүйелік функциясын, ал аталмаған
арналар үшін pipe жүйелік функциясы қолданады. Кейіннен арналармен жұмыс
кезінде үрдістер әдеттегі read, write және close сияқты файлдарға арналған
функцияларды қолданады. Тек pipe функциясын шақырған үрдістің туыстастары
болып табылатын бір-бірімен байланысқан үрдістер ғана аталмаған арналарға
қатынау құруды өз араларында бөле алады. Мысалға, егер В үрдісі арна құрып,
D және Е үрдістерін туғызса, бұл үш үрдіс өз аралығында арнаға қатынауды
бөлісіп алады. Бірақ барлық үрдістер аталған арнаға олардың
арақатынастарына байланыссыз және тек файлға қатынаудың қарапайым құқықтары
бар болған жағдайда қатынас құра алады.

Арна – үрдістер арасында байланыс құру механизмі болып табылады; арнаға
бір үрдіспен жазылып жатқан мәліметтер басқа үрдіс арқылы оқылуы мүмкін .
Мәліметтер бірінші кірген бірінші шығады кезегінде оңделеді (FIFO). Арна
ешқандай атқа ие болмайды; ол бір рет қолдану үшін құрылған және оның екі
ұшы арнаны құрған бірлік үрдістен мұра болуы қажет.
Үрдіс FIFO арқылы байланыс құруы үшін оны аты бойынша ашады.
Арна немесе FIFO бір уақытта екі ұшынан да ашылуы тиіс. Егер сіз ешкім
жазбай жатқан арнадан немесе FIFO файлынан оқып жатсаңыз оқу файлдың соңын
қайтарады. Оқылу үрдісіне болмайтын арнаға немесе FIFO-ға жазу қате шарты
ретінде өңделеді; бұл жағдай SIGPIPE сигналын және EPIPE қате кодын сигнал
өңделген немесе бұғатталған болса генерациялайды.
Арналар да, FIFO арнайы файлдары да файлды позициялауға рұқсат бермейді.
Оқу да, жазу да тізбекпен орындалады: файл басынан оқу және соңына жазу.

2.2. Арна құру
Арна құру үшін қарапайым операция – pipe функциясы. Ол арна соңының
жазуын да, оқуын да қамтамасыз етеді. Бұл жағдай бірлік үрдіс үшін ыңғайсыз
келеді, себебі бұл жағдайда ол арнаны өз өзімен диалог құру үшін
пайдаланады. Қарапайым қолдану кезінде үрдіс арнаны бірнеше балалық
үрдістерге бөлінуден алдын құрады. Арна аталық және балалық үрдістер
арасындағы немесе екі туыстас үрдіс арасындағы байланыс ретінде
қолданылады.
pipe функциясы 'unistd.h' тақырыптық файлында жарияланған.
int pipe (int filedes[2]) (функция)
pipe функциясы арнаны құрады және оқу және жазу үшін файл дескрипторларын
filedes [0] және filedes [1]-ге орнатады.
Сәтті аяқталған жағдайда pipe 0 мәнін қайтарады. Ал керісінше жағдайда
-1 қайтарылады. Келесі қатенің errno шарттары бұл функция үшін төмендегідей
анықталған:
EMFILE
үрдіс аса көп ашық файлдарды ұстап тұр.
ENFILE
бүкіл жүйеде аса көп ашық файлдар бар.
2.3. Қосымша үрдіске арна
Арналардың жалпы қолданылуы мәліметтерді қосымша үрдіс ретінде орындалып
жатқан программадан қабылдауы немесе оған жіберуі тиіс.
Мұны орындаудың тәсілдерінің бірі – келеісі комбинацияны қолдану: pipe
(каналды құру үшін), fork (қосымша үрдіс құру үшін), dup2 (қосымша үрдіске
pipe-ті шығару арнасы немесе стандартты енгізу ретінде қолдануға нұсқау
беру үшін) және exec (жаңа программаны орындау үшін). Немесе popen және
pclose-ті қолдануға болады.

2.4. pipe жүйелік функциясы

Арна құру функциясын шақырудың синтаксисі:
pipe(fdptr);
, мұндағы fdptr – екі бүтін санды айнымалыдан тұратын массивке нұсқағыш.
Онда арнадан оқу үшін және арнаға жазу үшін арналған файлдың екі
дескрипторы сақталатын болады. Ядро арналарды файлдық жүйе ішінде
құратындықтан және арна оны қолданудан алдын жүйеде болмағандықтан ядро
арнаны құрған кезде оған индекс жариялауы тиіс. Ол және де арна үшін бір
жұп қолданушы дескрипторларын және оларға сәйкес келетін файлдар
кестесіндегі жазбаларды жариялайды. Ядро файлдар кестесін қолданғандықтан
read, write және т.б. функцияларды шақырудың интерфейсі қарапайым файлдар
интерфейсімен сәйкестендіріліп орындалады. Нәтижесінде үрдістердің оқу
немесе жазуды қарапайым файл немесе арнаға орындап жатқанын білудің қажеті
жоқ.
Pipe алгоритмі
Кіріс мәліметі: жоқ
Шығыс мәліметі: жазу үшін файл дескрипторы
оқу үшін файл дескрипторы
{
Арна құрылғысынан жаңа индекс тағайындау(ialloc
алгоритмі);
Файлдар кестесіндегі бір жазбаны оқу үшін, бірін –қайта жазу үшін
белгілеу;
Файлдар кестесіндегі жазбаларды олар жаңа индекске көрсетіп тұратындай
етіп инициалдау;
Файлдың бір қолданушы дескрипторын оқу үшін, біреуін қайта жазу үшін
белгілеу, оларды файлдар кестесінде сәйкес кіру нүктелерін көрсетіп
тұратындай етіп инициалдау;
Индекстегі жүгіну санағышының мәнін 2-ге тең етіп орнату;
Оқуды және жазуды орындап жатқан үрдістер санын санаудың санағышының
мәнін 1 етіп қою;
}

Арналар құрудың алгоритмі (аталмаған)
Жоғарыдағы кестеде аталмаған арналар құру алгоритмі көрсетілген. Ядро арна
үшін файлдық жүйеден арна құрылғысы ретінде белгіленген индексті ialloc
алгоритмін қолдану арқылы жариялайды. Арна құрылғысы – бұл ядро каналдарға
индесктер жариялай алатын және мәліметтер үшін блоктарды белгілейтін
файлдық жүйе болып табылады. Жүйе администраторлары арна құрылғысын жүйені
конфигурациялау кезінде көрсетеді және бұл құрылғылар әр түрлі файлдық
жүйелерде сәйкес келуі мүмкін. Арна активті болып тұрғанша ядро арна
индексін және мәліметтік блоктарды басқа файлға қайта жариялай алмайды.
Содан соң ядро файлдар кестесінде арнаға жазу және оқу дескрипторларына
сәйкес келетін екі жазбаны белгілейді және жадыдағы индекс көшірмесіндегі
тіркеушілік мәліметтерді түзетеді. Файлдар кестесіндегі әрбір белгіленген
жазбада арнаның неше экземпляры оқу немесе жазу үшін ашық (бастапқыда 1)
екені жайлы мәлімет сақталады, ал индекстегі жүгінушілер санағышы арна неше
рет ашылғанын (бастапқыда 2) көрсетеді. Соңынан индексте арна ішіндегі
байттар ығысуы енгізу немесе шығарудың ендігі операциясы басталатын жерге
дейін жазылады. Осы ығысуларды индексте сақтауға байланысты арнадағы
мәліметтерге қатынауды олардың арнаға келіп түсу ретімен орындауға болады;
бұл жер арналардың ерекшелігін белгілеп береді, себебі қарапайым файлдар
үшін ығысулар файлдар кестесінде сақталады. Үрдістер бұл ығысуларды lseek
функциясының көмегімен ауыстыра алмайды. Сондықтан арна мәліметтеріне
кездейсоқ қатынау мүмкін емес.

2.5. Аталған арнаны ашу

Аталған арна – бұл аталмаған арнаның семантикасына ұқсас болып келетін файл
болып келеді. Бірақ бұл файлға каталогтағы жазба сәйкес келеді және оған
қатынасу аты тұрақты аты бойынша жүргізіледі. Үрдістер аталған арналарды
қарапайым файлдар сияқты ашады және осыған сәйкес аталған арналар көмегімен
бір-біріне мүлдем қатыссыз үрдістер қатынас құруы мүмкін. Аталған арналар
файлдық жүйе иерархиясында тұрақты түрде болады (ол жерден олар unlink
жүйелік функциясы көмегімен өшіріледі), ал аталмаған арналар уақытша болып
табылады: барлық үрдістер арнамен жұмысын аяқтағаннан соң ядро оның
индексін қайта алып қояды.
Аталған арнаны ашудың алгоритмі қарапайым файлды ашудың алгоритміне ұқсас
келеді. Бірақ та функциядан шығып кетудің алдында ядро аталған арнаны оқу
немесе жазу үшін ашқан үрдістер санын көрсететін индекстегі санағыштар
мәндерін арттырады. Аталған арнаны оқу үшін ашатын үрдіс өз жұмысын басқа
үрдіс аталған арнаны жазу үшін ашпағанша тоқтата тұрады және керісінше.
Үрдіс мәліметтерді алуды үміттенбесе, арнаны оқу үшін ашудың мағынасы жоқ.
Үрдістің арнаны оқу немесе жазу үшін ашып жатқанына байланысты ядро үрдісті
күтіп тоқтатылған үрдістер жұмысын қайта бастайды.
Егер үрдіс аталған арнаны оқу үшін ашып жатса және арнаға жазатын үрдіс бар
болса, онда ашу тоқтатылады. Немесе егер үрдіс no delay параметріне ие
аталған файлды ашып жатса, онда бірде-бір жазу үрдісі болмаған жағдайда да
open функциясы басқаруды дереу қайтарады. Барлық басқа жағдайларда жазу
енгізетін үрдіс арнаны ашпағанша үрдіс тоқтатылып тұрады. Осындай ережелер
арнаны жазу үшін ашып жатқан үрдістер үшін де орындалады.

2.6. Программалық арналар

Басында концепция жайлы бірнеше сөз. Бізде екі үрдіс болсын және осы
екі үрдіс арасында бір үрдістен екіншісіне мәліметтер жіберу арқылы олардың
арасында қатынас құру қажет. Unix жүйесінде бұл мақсатта арналар
қолданылады. Программалық жағынан қарастырған жағдайда арна екі
дескрипторға ие белгілі бір ұғым болып табылады. Бір файлдық дескриптор
арқылы үрдіс арнаға мәліметтерді енгізе алады, ал екіншісі арқылы оларды
арнадан оқи алады. Арна файлдық дескрипторларға байланысты болатындықтан
мұра ретінде балалық үрдістерге берілуі мүмкін. Бұл жағдай екі туыстас
үрдістің ортақ арнаны пайдалана алуын анықтап береді. Яғни бір үрдіс
белгілі бір мәліметті арнаға енгізсе, екіншісі дәл сол арнадан ол
мәліметтерді оқи алады.
Арнамен жұмыс жасаудың ерекшеліктері. Арна арқылы берілетін
мәліметтерді сақтау үшін оперативті жадының белгіленген қоры бөлінеді.
Кейбір жүйелерде бұл буфер сыртқы жадығы жалғасуы мүмкін. Үрдіс арнаға
мәлімет енгізгісі келіп, буфер толып қалған жағдайда немесе буферде
мәліметтер болмаған жағдайда арнадан мәліметті оқуға тырысқан жағдайда
қандай жағдай орын алады? Екі жағдайда да үрдіс өзінің орындалуын тоқтатады
және орын босамағанша немесе арнада мәлімет пайда болмағанша күтеді. Бұл
жағдайда үрдіс жұмысы орнатылған параметрлерге байланысты өзгеріп тұруы
мүмкін. Ол параметрлерді программалық түрде өзгертуге болады.
Бұл концепциялардың орындалуын жүйеден қарастырып кетейік. pipe
функциясы бар. Бұл функцияның аргументі екі бүтін мәнді айнымалыдан тұратын
массивке нұсқағыш болуы тиіс.
int pipe(pipes);
int pipes[2];
Массивтің нөлінші элементі 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 функциясын ешкім бір үрдіс шеңберінде
қолданбайды). Осы және кейіннен келтірілетін мысалдарда жауап бермеу
жағдайлары өңделмейді. Ендігі кезекте мазмұндырақ мысал қарастырайық.
Төменде екі үрдісті жүктейтін және оларды арна арқылы байланыстыратын
программа келтірілген:
main()
{
int fd[2];
pipe(fd); * аталық үрдісте арнаның екі дескрипторын құрамыз *
if (fork()) * дәл сондай дескрипторларға ие балалық үрдісті құрамыз *

{ * программаның бұл бөлігі аталық үрдісте жүреді *
dup2(fd[1],1); * стандартты шығаруды арнаға шығарумен алмастырамыз *
close(fd[1]); * арна дескрипторларын жабамыз *
close(fd[0]); * енді барлық шығару тек арнаға орындалатын болады *
execl(“binls”,“ls”,(char*)0); * аталық үрдіс денесін ls-ке
алмастырамыз *
} * бұл жерден балалық үрдіс өз жұмысын бастайды *
dup2(fd[0],0); * балалық үрдісте барлығын жоғарыдағыдай етіп жасаймыз
*
close(fd[0]);
close(fd[1]);
execl(“binwc”,“wc”,(char*)0);
}
Бұл мысал конвейер арқылы екі команданы – ls және wc-ді байланыстырады.
ls командасы каталог құрылымын шығарады, ал wc қатарлар санын санайды.
Жоғарыдағы программаның орындалуының нәтижесі ls командасы шығарған
қатарлар саны болып табылады.
Аталық үрдісте ls үрдісі жүктелген. Барлық шығыс ақпаратты ls каналға
жүктейді, себебі стандартты шығару құрылғысы арнамен байланыстырылған. Әрі
қарай балалық үрдісте wc үрдісі жүктеледі. Ол үрдісте стандартты енгізу
құрылғысы (яғни wc ақпаратты оқитын қор) арнадан оқу дескрипторымен
байланысқан. Бұл жағдай ls-тің өз стандартты шығару құрылғысына барлық
жазған ақпаратының wc командасының стандартты енгізу құрылғысына келетінін
білдіреді.
Жоғарыда айтылып кеткендей арна үзіліссіз жұмыс істеу үшін және оқитын
дескриптор файл соңының белгісін алуы үшін барлық жазатын дескрипторлар
жабылуы тиіс. Егер де біздің программада белгіленген қатар көрсетілменген
болғанда wc-мен байланысқан үрдіс тоқтап қалар еді, себебі бұл жағдайда
арнадан оқитын функция файл соңынының белгісін ала алмайды. Ол белгіні
шексіз көп уақытқа дейін күте береді. Аталық үрдісте белгіленген қатарды
көрсетпеуге де болатын еді, себебі дескриптор үрдістің аяқталуымен бірге
жабылатын еді. Ал балалық үрдісте мұндай қатар қажет болады. Яғни бұдан
шығатын қорытынды жұмысты аяқтағаннан алдын жазуға байланысты арналардың
барлық дескрипторлары жабылуы тиіс.
Арналар арқылы тек туыстас үрдістерді байланыстыруға болады. Техникалық
түрде канал арқылы бірнеше үрдісті байланыстыруға болады, бірақ бұл
жағдайда қайшылықтар пайда болуы мүмкін.
Программалық арналар Unix-тің барлық версияларында бар. Арна pipe
шақыруымен құрылады және бір жақты мәліметтер жіберуге мүмкіндік береді.

#include unistd.h
int pipe(int fd[2]);
*сәтті аяқталған жағдайда 0, қате жағдайда -1 қайтарады*
Функция екі файлдық дескрипторды: fd[0] және fd[1]-ді қайтарады. Олардың
біріншісі оқу үшін, ал екіншісі жазу үшін ашылады.
Ескерту. Unix-тің кейбір версиялары, атап өткенде SVR4 екі жақты
арналарды (full-duplex pipes) қолдайды. Бұл жағдайда арна екі ұшынан да оқу-
жазуға ашық болып саналады. Екі жақты IPC арнасын құрудың ендігі бір тәсілі
socketpair функциясын шақыру болып табылады. Оны қазіргі UNIX версияларының
көбінде қолдануға болады. Бірақ көп жағдайда арналар командалар
интерпретаторымен жұмыс жасаған кезде қолданылады. Бұл жерде бір жақты
арналарды қолдану орынды болады.

Дескриптор (файл, программалық канал немесе FIFO) типін анықтау үшін
S_ISFIFO макросын қолдануға болады. Ол жалғыз stat құрылымының st_mode
өрісі аргументін қабылдайды және шынайы (нөлге тең емес) немесе жалған
(нөл) мәндерін қайтарады. Канал үшін stat құрылымын fstat функциясы
қайтарады. FIFO үшін құрылым fstat, lstat және stat функцияларымен
қайтарылады.
Арна бір үрдіс тарапынан құрылғанына қарамастан ол тек осы үрдіспен
ғана өте сирек қолданылады. Әдетте арналар екі үрдіс арасында (аталық және
балалық) байланыс құру үшін келесідей қолданылады: үрдіс арнаны құрады, ал
содан соң fork-ті өзінің көшірмесі – балалық үрдісті құру үшін шақырады.
Осыдан кейін аталық үрдіс арнаның оқу үшін ашылған ұшын, ал өз кезегінде
балалық үрдіс жазу үшін ашылған арна ұшын жабады. Бұл жағдай үрдістер
арасында мәліметтерді бір бағытты жіберуге жағдай жасайды. Мысалы:

Who sort lp
командасына ұқсас команда енгізілгенде UNIX-тің командалық
интерпретаторында интерпретатор жоғарыда аталған іс-қимылдарды арасында екі
арнасы бар үш үрдісті құру үшін орындайды. Бұдан бөлек интерпретатор оқу
үшін ашылған әрбір арнаның ұшын стандартты енгізу ағынына, ал жазу үшін
ашылғанын – стандартты шығару ағынына қосады.
Жоғарыда қарастырылған арналардың барлығы бір бағытты, яғни
мәліметтерді тек бір бағытта жіберуге мүмкіндік беретін еді. Мәліметтерді
екі жаққа жіберу керек болған жағдайда мәліметтерді бір жаққа жіберу үшін
бір жұп арналарды құру керек. Екі жақты бағытталған IPC арналарын құрудың
кезеңдері келесідей:

... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Социология ғылымының деңгейлер
Әлеуметтанудың пәні мен әдісі
Әлеуметтанудың пәні мен объектісі
Социология ғылым ретінде
Әлеуметтанудың құрылымы мен қызметтері
Теориялық әлеуметтану түсінігі
Кәсіпорынның өңдірістік құрылымы жайлы
Биофизика
Өндірісті жоспарлау
Еуразиялық Экономикалық Қауымдастықтағы Қазақстан
Пәндер