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
Достарыңызбен бөлісу: |