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



Pdf көрінісі
бет178/220
Дата25.02.2022
өлшемі2,22 Mb.
#26438
түріОқулық
1   ...   174   175   176   177   178   179   180   181   ...   220
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   ...   174   175   176   177   178   179   180   181   ...   220




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

    Басты бет