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() өңдеуші – функция шақырылады, ол экранға
қабылданған сигналдың нөмірін шығарады және қабылданған
сигналдың нөміріне тең қайтару кодымен процесті аяқтайды.
Достарыңызбен бөлісу: |