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



Pdf көрінісі
бет177/220
Дата25.02.2022
өлшемі2,22 Mb.
#26438
түріОқулық
1   ...   173   174   175   176   177   178   179   180   ...   220
Байланысты:
қазақша кітап

10.3.6.  СИГНАЛДЫ ПЕРДЕЛЕР 
 
Процестің 
сигналды 
перделері, 
процеспен 
қабылданған 
сигналдардың  қандайы  еленбейді  және  өңделмейтінін  анықтайды. 
Құрылу кезінде процесс өзінің ата-анасының сигналды пердесін мұраға 
алады,  бірақ  та  процестің  өмірлік  циклінің  жүрісі  кезінде,  сигналды 
перде өзгеруі мүмкін. 
 
Сигналды  перденің  күйін  оқу  немесе  орнату  үшін  sigprocmask() 
функциясы қолданылады:
 
#include 
 
int sigprocmask(int cmd, const sigset_t *new_mask, 
sigset_t *old_mask);
 
cmd  параметрі  перденің  астында  орындалатын  әрекеттерді  береді, 
және келесі мәндерді қабылдайды: 
 
■ 
SIG_SETMASK  —  процестің  сигналды  пердесін  new_mask 
параметрі ретінде жіберілетін перденің мәніне алмастырады:
 
■ 
SIG_BLOCK  —  процесс  пердесіне  new_mask  параметрі  ретінде 


 
198 
 
берілетін  пердеде  көрсетілген  сигналдарды  қосады.  Қосылған 
сигналдар процеспен еленбейді;
 
■ 
SIG_UNBLOCK  —  new_mask  параметрі  ретінде  берілген  пердеде 
көрсетілген  сигналдарды процесс пердесінен сигналдарды  өшіреді.  
Өшірілген сигналдар процеспен еленбейді.
 
Сигналды перденің мәндері өзгерген болса, оның көне мәнін сақтап 
қалу қажет, әйтпесе, мәндері сақталған айнымалылар сілтеме бойынша 
old_mask  параметрі  ретінде  жіберіледі.  Егер  көне  мәнді  сақтау 
қажеттілігі  болмаса,  бұл  параметрдің  мәні  ретінде  NULL  жіберіледі. 
Айнымалы  процесінде  сигналды  перденің  мәнін  сақтау  талап  етілсе,  
old_mask тәрізді жіберілімдер, оны өзгертпей,  new_ mask параметрінің 
мәні ретінде  NULL жіберіледі.
 
Процестің  пердесін  анықтайтын,  айнымалы  sigset_t  типін 
қалыптастыру  үшін  үш  функция  қызмет  етеді—  sigemptyset(), 
sigaddset() и sigdelset(). 
 
#include 
 
int sigemptyset( sigset_t *sigmask ) ;
 
int sigaddset( sigset_t *sigmask, const int
 
signal_num );
 
int sigdelset( sigset_t *sigmask, const int signal_num 
); 
 
Sigemptyset()  функциясы  sigmask  параметрі  секілді  берілетін 
айнымалыда  құлыпталған  сигналдардың  барлығын  тазартады. 
Sigaddset()  функциясы,    signal_num  нөмірлі  сигналын  перденің 
блокталған  сигналдары  тізіміне  қосады,  мұнда  берілген  sigmask 
параметрі  ретінде  айнымалы  болады.  Sigdelset()  функциясы  кері 
әрекетті  орындайды    —  signal_num  нөмірлі    сигналын  sigmask  
пердесінде  блокталған  сигналдарды  тізімнен  өшіреді.  Сәтті  орындалу 
жағдайында,  бұл  функциялар  0  қайтарылады,  сәтсіз  болған  жағдайда 
(мысалы, sigmask нұсқауында қате болғаны кезінде немесе  signal_num 
нөмірі қате болған жағдайда) -1 қайтарылады.
 
Сигналды  перделердің  қолданысын  келесі  мысалда  қарастырамыз. 
Процесс  SIGINT  сигналын  күтеді,  оны  қабылдағанда  бұл  типтің  жаңа 
сигналдарын өңдейді, «Таймер қосылды» хабарламасын шығарады,  5 с 
күтеді,  «Таймер  тоқтатылды»  хабарламасы  шығады,  SIGINT 
сигналының  өңделуін  қалпына  келтіреді,  оның  өңделуін  блоктан 
шығарады  және  тағыда  сигнал  келуін  күтеді.  Егер  SIGINT  сигналы  5 
секундтық  үзілісте  келсе,  ол  еленбей  қалады.  Қабылданған  сигналдың 


199 
 
 
үзілісі,  осы  жағдайда  өңдеуші  шақыруының  қайталануынан  немесе 
әдеттегідей өңдеушінің шақыруға мүмкіндік береді:  
 
#include 
 
#include 
 
sigset_t sigmask;
 
void handler(int sig_no)
 
{
 
sigemptyset(&sigmask ) ;  
sigaddset(&sigmask, sig_no ) ; 
sigprocmask(SIG_BLOCK, &sigmask, NULL);
 
printf("Timer started\n");
 
sleep(5);
 
printf("Timer stopped\n");
 
signal( sig_no, &handler ) ; 
sigprocmask(SIG_UNBLOCK, &sigmask, NULL);  
}
 
int main()
 
{
 
signal( SIGINT, &handler ) ; while (1)
 
{
 
pause();
 
}
 
}
 
Келесі  міндеттерден  бағдарламаларды  (оны  орындайтын  файлдың 
атауы— signal5) іске асыру: 
 
#!/bin/bash 
./signal5  & 
pid=$!
 
for i in 1 2 3 4 5 6 ; do  
sleep 1
 
kill -SIGINT $pid  
done
 
kill -SIGTERM $pid
 
экранға шығарылады: 
 
Timer  started 
Timer  stopped 
Timer   


 
200 
 
started
 
./signal5.sh: line 11: 1276 Terminated
 
Sigemptyset()  және    sigaddset()  функцияларының  орындалу  уақыты, 
өңдеудің басында өте аз. Дегенмен, егер де бұл функцияларды орындау 
кезінде  сигналдар  түсуі  мүмккін  болса,  онда  бұл  функциялардың 
шақырылуын  main()  функциясының  басына  орнын  ауыстыруға  және 
sigaddset(&sigmask,  SIGINT)  шақыру  көмегімен,    SIGINT  сигналын 
блоктаушы  перденің  қажетті  мәнін  қалыптастыруға  болады.    Сигнал 
нөмірі өңдеуші параметр арқылы емес, нақты берілетін болғандықтан, 
өзінің әмбебаптылығын құрбан етуі мүмкін.
 
 
 
 
10.3-сурет. Орнатылған сигналды перде кезінде процестің орындалуы 
 
Егер  процесс  орындалуы  жүрісін  уақыт  сызығында  бейнелесек,  
10.3- суретте көрсетілген бейнені алуға болады  (екінші сигнал SIGINT 
еленбейді). 
 


Достарыңызбен бөлісу:
1   ...   173   174   175   176   177   178   179   180   ...   220




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

    Басты бет