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


  10.3.2. BASH СИГНАЛДАРЫ



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

188 
10.3.2. BASH СИГНАЛДАРЫ 
BASH интерпретатордың көмегімен, белгілі PID сигналдарын 
тасымалдау үшін kill командасын қолдануға болады. Оны шақырудың 
параметрлері мынадай:
kill -<мнемоника немесе сигнал нөмері > 
Мысалы, процеске PID = 1046 бірге SIGKILL сигналды тасымалдау 
үшін келесі сигнал нөмірін қолдануға болады:
kill -9 1046
Ал процеске PID = 1079 бірге, SIGINT сигналын тасымалдау үшін 
оның мнемоникасын пайдалануға болады: 
kill -SIGINT 1079
Кill командасын шақырған кезде, нөмірді немесе жіберілетін 
сигналдың мнемоникасын көрсетпеуге де болады. Сонымен бірге, 
SIGTERM сигналы жіберіледі. 
Процестің BASH тілінде соңғы іске асырылған тапсырмасынан PID 
алу үшін жүйелік айнымалы $! қолданылады. Белгісіз PID процесіне 
сигналды жіберу қажет болса, алайда оның атауы белгілі болса
туындайтын процестің іске асырылу нәтижесінде killall командасын 
қолдануға болады. killall командасы параметрлермен берілген 
сигналдарды барлық іске асырылған бағдарлама нәтижесінде 
туындаған процеске жібереді, killall командасының іске қосылуы 
параметрлермен беріледі. Команданы шақырту параметрі мынадай: 
killall -<мнемоника немесе сигнал нөмері> <бағдарлама 
аты>
Мысалы, timer бағдарламасының іске асырылуымен қосылған 
процеске SIGALRM сигналын жіберу үшін killall командасын 
келесідегідей қолдануға болады:
killall -ALRM timer
Кillall командасын шақырту кезінде дәл осылай жіберілетін сигнал 
нөмірін көрсетпеуге де болады, сонымен қатар әдеттегідей SIGTERM 
сигналы жіберілетін болады.
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 
#include
void signal(int signal_num, void *handler_address);


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   ...   116   117   118   119   120   121   122   123   ...   158




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

    Басты бет