Оқулық «Федералдық білім беруді дамыту институты»



Pdf көрінісі
бет58/158
Дата01.07.2023
өлшемі3.83 Mb.
#475485
түріОқулық
1   ...   54   55   56   57   58   59   60   61   ...   158
операциялық жуйелер

80 
 
Осындай тексерістің классикалық үлгісіне айналған мысал төменде 
келтірілген: 
#include 
#include int main(void)
{
pid_t pid;
switch (pid = fork())
{
case -1:
/* fork() Сәтсіз орындалу — pid тең -1 */ 
perror("Unsuccessful fork() execution\n"); break;
case 0:
/* Еншілес процес денесі */
/* pid = 0 — бұл еншілес процес. */
/* Онда pid мәні нольмен инициацияланады */ sleep(1);
printf("CHILD: Child spawned with PID = %d\n", 
getpid());
printf("CHILD: Parent PID = %d\n", getppid());
/* Еншілес процес жұмысының аяқталуы */
_exit(0);
default:
/* процес денесі-аналық процесіне жатады */
/* pid>0. Демек, тегінің pid алған аналық процес /* 
/*орындалып жатыр */
printf("PARENT:Child spawned with PID=%d\n", 
pid);
printf("PARENT:Parent PID=%d\n", getpid());
}
/* 
Процес 
денесі-fork()өңделгеннен 
кейін 
аналық 
процесінің денесі */
/* Егер case 0 _exit(0) көрсетілмесе, онда*/
/* тегінің артынан ерген команданы орындаған болар еді*/
exit(0);
}
Бағдарлама 
келесі 
жолақтарды 
шығарады 
(процестер 
идентификаторлары бір-бірінен ерекшеленуі ықтимал):
PARENT:Child spawned with PID=2380 
PARENT:Parent PID=2368 CHILD: Child 
spawned with PID = 2380 CHILD: Parent 


81
 
PID = 1
Бағдарламаның келтірілген мысалында келесі іске назар аудару 
қажет: егер case сәйкес нұсқа ішінде топ-процесінен шығуды 
қамтамасыз етпесе, онда топ case ішінде бағдарламалық кодты 
орындауды аяқтап болған соң, switch() құрылысының жабылатын 
жақшасынан кейін орналасқан кодты орындауды жалғастырады. Көп 
жағдайда бұндай әрекеттің алдын алу керек. Берілген қайтару кодымен 
процестен нақты шығу үшін _exit(<қайтару коды>) атқарымы 
қолданылады. Бұл атқарым шақырту процесін жойып, келесі 
әрекеттердің орындалуына алып келеді: 
■ 
жеткізілуді күтіп отырған барлық сигналдар өшеді (10.3-бөлімін 
қараңыз);
■ 
барлық ашық файлдар жабылады;
■ 
ресурстарды пайдалану статистикасы proc файлдық жүйеде 
сақталады;
■ 
аталық-процес хабарлайды және топтардағы PPID орын 
ауыстырылып қойылады;
 
■ 
процес күйі «зомби» ауысады (4.3-бөлімін қараңыз). Процес 
жұмысын аяқтаудың басқа тәсілдері басқа бөлімдерде қарастырылатын 
болады.
процес-топты аяқтау үшін exit() атқарымының орнына _exit()
қолдану керек. Ал, _exit() атқарымы процеске қатысты ядро 
құрылымын — дескриптор мен процес контексті тазартады. Одан 
ерекше 
exit() 
атқарымы 
көрсетілген 
әрекеттерге 
қосымша 
пайдаланушы деректерінің барлық құрылымын бастапқы күйге қайта 
әкеледі. Мұның нәтижесінде аналық-процестің құрылымына зақым 
келетін жағдай туындауы ықтимал. Еxit () қызметі тек аналық-
процеспен орындалатын атқарымдарда пайдаланылады. 
Көп жағдайда fork() атқарымы exec...() тобының атқарымдарының 
бірімен бірге қолданылады. Бұл атқарымдарды бірге қолдану кезінде 
жаңа процесті жүргізу және одан жаңа бағдарламаны жіберу мүмкіндігі 
бар.
Еxec...() атқарымын орындау нәтижесінде бағдарламалық код пен 
процестердің 
деректері 
жіберіліп 
жатқан 
бағдарламаның 
бағдарламалық кодына ауысады. Өзгеріссіз қалатын тек процес 
идентификаторы PID мен PPID аналық процес идентификаторы.
Егер exec...() тобының атқарымының орындалуы сәтсіз аяқталса, ол 
мынадай себептерден болуы ықтимал:
1. Орындалатын 
файлға апаратын жол жүйелік параметр 
PATH_MAX мәнінен асып түседі, файлға дейінгі жолдың элементі 
NAME_MAX жүйелік параметр мәнінен асып түседі немесе файл 
атауының рұқсаты кезінде жолдағы символдық сілтемелер саны 




Достарыңызбен бөлісу:
1   ...   54   55   56   57   58   59   60   61   ...   158




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет