Сиграция - Sigaction

Есептеу кезінде, сигакция арқылы анықталған API функциясы болып табылады POSIX программистке нақты ОЖ-ны қабылдау кезінде бағдарламаның мінез-құлқы қандай болатынына қол жеткізу сигналдар.

Жалпы

Жылы Unix тәрізді операциялық жүйелер процесаралық байланыс сигналдар арқылы жүреді. Орындаушы бөлім (процесс немесе жіп ) ОЖ-нен сигнал алады, ол мәліметтер парағында және осы сигналдың шартты мағынасында анықталған тәсілмен әрекет етуі керек (яғни оның мәліметтерін демпингке жіберу, орындалуын тоқтату, бірдеңе синхрондау ...).

The сигакция () жүйелік шақыру белгілі бір жүйеге сақталмаған сигнал алған жағдайда бағдарламаның әрекетін жариялау үшін қолданылады. Бұл жүйені шақырумен қатар, сигналды өңдеу процедурасына функционалды сілтемені қамтитын құрылымды беру арқылы жасалады. Кейбір алдын ала анықталған сигналдар (мысалы SIGKILL) жүйемен өңделетін және бұндай жүйелік қоңыраулармен ауыстырыла алмайтын құлыпталған мінез-құлқы бар.

сигакция құрылымы

POSIX стандарты сигакция құрылымын тақырыптық файлында төмендегідей анықтағанын талап етеді және ол кем дегенде келесі өрістерді қамтуы керек:

құрылым сигакция {	жарамсыз         (*sa_handler)(int);      / * сигнал өңдеушінің мекен-жайы * /	sigset_t     sa_mask;                 / * бұғаттауға арналған қосымша сигналдар * /	int          sa_flags;                / * сигнал параметрлері * /		/ * балама сигнал өңдеушісі * /	жарамсыз         (*sa_sigaction)(int, siginfo_t *, жарамсыз*);};

Қосымша, мүмкін портативті өрістерді анықтау еркін. Sa_handler мүшесі процесс сигнал алған кезде шақырылатын функцияның мекен-жайын анықтайды. Сигнал нөмірі осы функцияға бүтін аргумент ретінде беріледі. Sa_mask мүшесі сигнал өңдеуішін орындау кезінде бұғатталатын қосымша сигналдарды көрсетеді. sa_mask инициализациясы sigemptyset (3) болу керек. Sa_flags мүшесі қосымша жалаушаларды анықтайды. sa_sigaction - бұл параметрлердің әр түрлі жиынтығы бар балама сигнал өңдегіші. Sa_handler немесе sa_sigaction тек бір сигнал өңдеушісі көрсетілуі керек. Егер sa_handler орнына sa_sigaction қолдану қажет болса, SA_SIGINFO жалаушасы орнатылуы керек.

Ескіргенін ауыстыру сигнал ()

The сигакция () функциясы сенімді емес сигналдарды ауыстыру кезінде сенімді сигналдардың интерфейсін ұсынады сигнал () функциясы. Сигналды өңдеушілер сигнал () өңдеуші орындалмас бұрын интерфейс жойылады. Тұрақты өңдеушілерді қоңырау шалу арқылы қайта орнату керек сигнал () өңдеушінің орындалуы кезінде, сенімсіздік туғызса, өңдеушінің орындалуы кезінде, бірақ қайта орнатудың алдында дәл осындай типтегі сигнал келіп түседі. Орнатқан өңдеушілер сигакция () интерфейсті тұрақты түрде орнатуға болады және өңдегішті орындау кезінде таңдамалы сигналдар жиынтығын бұғаттауға болады. Бұл сигналдар өңдегіштің қалыпты тоқтатылуынан кейін бірден блоктан шығарылады (бірақ C ++ ерекшеліктерін тастау сияқты қалыптан тыс тоқтаған жағдайда емес).

C ++ тілінде қолданыңыз

C ++ тілінде көріңіз {/ * ... * /} аулау {/ * ... * /} бағдарламалау құрылымы сигналға негізделген болуы мүмкін (хост платформаларына байланысты). Кімге аулау сияқты кейбір платформаларда C ++ ерекшеліктеріне аударылған сигналдар, компилятордың арнайы қосқыштары қажет болуы мүмкін -қоңырауға байланысты ерекшеліктер үшін GCC және Intel C компиляторы.[1]

Мысал

# қосу <stdio.h># қосу <stdlib.h># қосу <string.h># қосу <unistd.h># қосу <sys/wait.h># қосу <signal.h># NUMCHLDS-ті анықтаңызжарамсыз sigchld_handler(int, siginfo_t*, жарамсыз*);sig_atomic_t	nexitedchlds = 0;intнегізгі(int аргум, char *аргв[]){	құрылым сигакция әрекет ету;	memset(&әрекет ету, 0, өлшемі(құрылым сигакция));	sigemptyset(&әрекет ету.sa_mask);	әрекет ету.sa_sigaction = sigchld_handler;	әрекет ету.sa_flags = SA_SIGINFO;	егер (-1 == сигакция(SIGCHLD, &әрекет ету, ЖОҚ))	{		перрор(«sigaction ()»);		Шығу(EXIT_FAILURE);	}	үшін (int мен = 0; мен < NUMCHLDS; мен++)	{		қосқыш(шанышқы())		{			іс 0:                                /*                                 * Ескі ОЖ енгізілімдері, олар дұрыс орындалмайды                                 * siginfo құрылымы шығу кодын қысқартады                                 * 0xFF көмегімен маска жасау арқылы.                                 */				қайту 1234567890;				/ * ЕШКІМДІ ЖОҚ *			іс -1:				жазу(STDERR_FILENO, «шанышқы ҚАТЕ!», 11);				Шығу(EXIT_FAILURE);				/ * ЕШКІМДІ АЛМАДЫ * /			әдепкі:				printf(«Бала жасады n");		}	}	уақыт (1)	{		егер (nexitedchlds < NUMCHLDS)			кідірту();		басқа			Шығу(EXIT_SUCCESS);	}        / * ЕШКІМДІ АЛМАДЫ * /	қайту 0;}жарамсызsigchld_handler(int қол қою, siginfo_t *сыныпо, жарамсыз *контекст){	pid_t proc;		уақыт ((proc = күтуші(-1, ЖОҚ, WNOHANG)) > 0)	{		/ * негізгі жіптің сигналы * /		nexitedchlds++;		/*                 * ескерту: printf () сигналға қауіпті емес!* оны сигнал өңдегішінде қолданбаңыз.                 * si_code - бұл баладан шыққан 32 биттік толық код (сонымен қатар waitid () бөлімін қараңыз).		 */		printf(«sinfo-> si_pid =% ld nproc =% ld nшығу коды% d шығу себебі% d n",				(ұзақ)сыныпо->si_pid, (ұзақ)proc, сыныпо->si_status, сыныпо->si_код);	}}

Әдебиеттер тізімі

Сыртқы сілтемелер