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



Pdf көрінісі
бет124/158
Дата01.07.2023
өлшемі3.83 Mb.
#475485
түріОқулық
1   ...   120   121   122   123   124   125   126   127   ...   158
операциялық жуйелер

10.3.7. ТАЙМЕР 
Сигналдарды пайдалауға негізделген жоғарыда қарастырылған 
барлық мысалдардың барлығында бір ортақ кемшілікке ие — олардың 
орындалу уақыты толығымен сыртқа ортаға тәуелді. Бұл 
бағдарламалардың орындалуын, SIGKILL немес SIGINT сигналдарын 
жіберіп басқа бағдарламалар немесе [Ctrl+C] басу арқылы 
пайдаланушы аяқтайды. Егер мұндай процесс пайдаланушының 
қатысуынсыз фондық режимде орындалатын болса, онда процестің 
аяқталуы тек басқа процестерге байланысты болады. Процестің өзі күту 
режимінде болып, өзінің орындалуын аяқтай алмайды.


201 
Бұл мәселені шешу үшін UNIX-те жүйелік шақырту alarm() 
анықталады: 
#include 
unsigned int alarm(unsigned int time_interval);
Секундпен берілген, time_interval уақыт интервалының аяқталуы 
бойынша alarm() фукнциясын шақыртқаннан кейін ядро осы 
функцияны шақыртқан процеске SIGALRM сигналын жібереді.
Егер alarm() функциясын уақыт интервалы аяқталмай шақыртқан 
болса онда функция time_interval параметрімен берілген жаңа интервал 
қояды және бұрынғы интервалдың аяқталуына дейінгі қалған секунд 
санын қайтарады. Егер time_interval параметрінің мәні осы кезде нөлге 
тең болса, онда жіберілім болдырылмайды. 
Аlarm() функциясы берілген уақыт аралығының аяқталуына 
байланысты процессті дұрыс аяқтау үшін қолданылауы мүмкін. Ол 
үшін процестің орындалуын аяқтайтын SIGALRM сигналын анықтау 
және бағдарламаның орындалуы басында alarm() функциясын шақыру
жеткілікті. Мысалы, іске қосылғаннан 20 сек өткеннен кейін аяқтау 
үшін функцияны қолданылатын бағдарламалар мыналар:
#include 
#include 
void hdlrAlarm(int sig_no)
{
printf("Execution terminating\n"); exit(0);
}
void hdlrInt(int sig_no)
{
signal( sig_no, &hdlrInt ) ; printf("Signal %d 
caught\n", sig_no);
}
int main()
{
signal( SIGINT, &hdlrInt); signal( SIGALRM, &hdlrAlarm); 
printf("Timer started\n"); alarm(20); while (1)
{
printf("Waiting...\n");
pause();
}
return 0;
}
Тапсырмалардан бағдарламаны іске қосуы кезінде (signal6 
орындалатын файлдың атауымен):


202 
#!/bin/bash ./a & pid=$!
for i in 1 2 3 4 5 6 ; 
do sleep 1
kill -SIGINT $pid done
wait $pid
экранға шығарылады:
Timer started 
Waiting...
Signal 2 caught 
Waiting...
Signal 2 caught 
Waiting...
Signal 2 caught 
Waiting...
Signal 2 caught 
Waiting...
Signal 2 caught 
Waiting...
Signal 2 caught 
Waiting...
Execution terminating 


Достарыңызбен бөлісу:
1   ...   120   121   122   123   124   125   126   127   ...   158




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

    Басты бет