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


  СИГНАЛДАРМЕН  ЖҰМЫС ЖАСАУ



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

10.3.3. 
СИГНАЛДАРМЕН  ЖҰМЫС ЖАСАУ  
ҮШІН  ЖҮЙЕЛІК  ШАҚЫРУЛАР  
UNIX-жүйелерде  сигналдармен  жұмыс  жасау  үшін  жүйелік 
шақыртулардың  интерфейсі  анықталды.  Жұмыс  үшін  ақпараттар 


189 
 
 
түрлері  мен  функция  түпнұсқасы,  signal.Һ  тақырыптық  файлдарда 
анықталған. 
 
C-бағдарламасында 
сигналдарды  беру  үшін  kill()  жүйелік 
шақыртулары пайдаланылады. : 
 
#include 
 
int kill(pid_t pid, int signal_num); 
 
Мұнда    signal_num  параметрі  жіберілетін  сигналдың  атын  береді. 
Егер  pid  параметр  —  оң  сан  болса  сигнал    PID  процесіне  беріледі, 
параметр  мәніне  тең.  Егер    pid    параметрі  нөлге  тең  болса  EUID  
жіберуші  сигналы      EGID  тең  болса,  онда  сигнал  барлық  процеске 
жіберіледі.  Егер  EUID  =  0  болса,  яғни  сигналдарды  жіберу 
суперпайдаланушы    root  -  тан  жүреді,  PID  =  0  және  PID  =  1 
процестерінен  басқа,  сигнал  барлық  процеске  жіберіледі.  Егер    pid 
параметрі  —  теріс  сан  болса  сигнал  EGID  параметрінің  абсолютті 
мәніне тең болатын барлық процестерге жіберіледі. 
 
Келесі  бағдарлама  kill()  функциясының  қолданылуына  мысал 
келтіреді  —    бағдарлама  SIGTERM    сигналының  көмегімен  ата-ана- 
процесінің  орындалуын  еріксіз  аяқтайтын,  топ-процестердің  пайда 
болуына себеп болады және осы туралы хабарлама шығарады:  
 
 
#include 
 
#include 
 /* Linux – ке қажетсіз */
 
#include 
 
#include 
 
#include  
 
int main()
 
{
 
pid_t pid;
 
setvbuf(stdout,(char*)NULL,_IONBF,0);
 
switch (pid = fork() )
 
{
 
case -1:
 
perror("Unsuccesful fork");
 
_exit(1); break; case 0:
 
printf("Parent process with PID = %d\n", getppid()); 
kill( getppid(), SIGTERM);
 
sleep(1);
 
printf("Parent process terminated\n"); 
printf("New parent process have PID = %d\n", 


 
190 
 
getppid() ) ;
 
_exit(0);
 
break;
 
default:
 
while (1);  /* шексіз цикл */
 
/* SIGTERM  қабылдауға дейін*/
 
}
 
}
 
 
Жоғарыда  келтірілген  бағдарламаға  параметр  ретінде  берілген 
секунд  санына  (осы  жағдайда  —1  с)  процесстің  орындалуын  тоқтата 
тұратын  sleep()  функциясы  қолданылған.  Бұл  ата-ана-процесінің 
аяқталуға  уақыттың  жеткілікті  қалуы  үшін  жасалған,  одан  кейін  топ-
процесінің PPID ауысуы болады. Sleep() функциясы және оны қолдану 
ерекшеліктері туралы бұдан әрі қарастыралатын болады. 
 
Процестердің жұмысы нәтижесінде экранға мыналар шығады:  
 
Parent process with PID = 1276 Terminated
 
Parent process terminated New parent process 
have PID = 1
 
 
Экранға  «Terminated» сөзін шығару SIGTERM  сигналының әдепкі 
өңдеушілермен орындалған. 
 
Бағдарламаға  сигналды  өңдеуші-функциясын  беру  үшін  signal() 
жүйелік шақыруы қолданылады: 
 
#include 
 
void signal(int signal_num, void *handler_address); 
 
Мұнда  signal_num  сигнал  нөмірін  береді,  оны  қабылдаған  кезде 
процесс  өңдеуші-функциясының  орындалуын  бастайды.  Оның  мекен-
жайы handler_address параметрімен беріледі.
 
Жоғарыда  айтылғандай,  өңдеуші-функцияның  тақырыбының 
форматы мынадай болады:  
 
void handler(int sig_num); 
 
мұнда sig_num параметрі арқылы өңдеуші-функцияға сигнал нөмірі 
беріледі, оны қабылдаған кезде, функция шақырылады. 
 
Сигналдың өңдеушісін  анықтайтын типтік  бағдарламалар  мынадай 
бейнеленеді:  
 
#include 
 


191 
 
 
#include 
 
#include 
 
void handler( int sig_no )
 
{
 
printf("Signal with number %d caught\n", sig_no); _exit( 
sig_no ) ;
 
}
 
int main()
 
{
 
signal( SIGALRM, &handler ) ; signal( SIGINT, &handler ) 
; while (1); return 0;
 
}
 
 [Ctrl+С] батырмаларын басқан кезде бағдарлама келесіні 
шығарады: 
Signal with number 2 caught
 
Себебі [Ctrl+C] үйлесімді батырмаларын басу ағымдағы процеске 
SIGINT сигналын жібереді.
 
Мұнда main()функциясы SIGALRM және SIGINT сигналдары үшін 
өңдеуші-функциясы  анықталады,  одан  кейін  бағдарлама  сигналдың 
келуін күтетін шексіз циклге түседі. Екі сигналдың біреуін қабылдаған 
кезде  handler()  өңдеуші  –  функция  шақырылады,  ол  экранға 
қабылданған  сигналдың  нөмірін  шығарады  және  қабылданған 
сигналдың нөміріне тең қайтару кодымен процесті аяқтайды. 
 
 


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




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

    Басты бет