/* sigactdemo.c
* purpose: shows use of sigaction()
* feature: blocks ^\ while handling ^C
* does not reset ^C handler, so two kill
*/
#include <stdio.h>
#include <signal.h>
#define INPUTLEN 100
main()
{
struct sigaction newhandler; /* new settings */
sigset_t blocked; /* set of blocked sigs */
void inthandler(); /* the handler */
char x[INPUTLEN];
/* load these two members first */
newhandler.sa_handler = inthandler; /* handler function */
newhandler.sa_flags = SA_RESETHAND | SA_RESTART; /* options */
/* then build the list of blocked signals */
sigemptyset(&blocked); /* clear all bits */
sigaddset(&blocked, SIGQUIT); /* add SIGQUIT to list */
newhandler.sa_mask = blocked; /* store blockmask */
if ( sigaction(SIGINT, &newhandler, NULL) == -1 )
perror("sigaction");
else
while( 1 ){
fgets(x, INPUTLEN, stdin);
printf("input: %s", x);
}
}
void inthandler(int s)
{
printf("Called with signal %d\n", s);
sleep(s);
printf("done handling signal %d\n", s);
}
Unix/Linux系統(tǒng)編程實(shí)踐教程一書P205頁例子,上面使用函數(shù)sigaction,主要是演示在處理SIGINT(ctrl + C)時(shí)阻塞SIGQUIT(ctrl + ),搜了下結(jié)構(gòu)體sigcation中sa_mask的作用是要阻塞的信號當(dāng)在處理時(shí),因此用sigaddset等函數(shù)添加了SIGQUIT信號,可是執(zhí)行時(shí)卻報(bào)錯(cuò)
[root@centos-linux-7 CH07]# ./sigactdemo
^\退出(吐核)
[root@centos-linux-7 CH07]# gcc -v
使用內(nèi)建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
目標(biāo):x86_64-redhat-linux
配置為:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
線程模型:posix
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
[root@centos-linux-7 CH07]# 代碼沒有問題。
默認(rèn)情況下,SIGQUIT 信號導(dǎo)致進(jìn)程終止,并產(chǎn)生 Core Dump,即你所描述的“吐核”。
當(dāng)進(jìn)程被 SIGINT 信號中斷時(shí),由于設(shè)置 sa_mask 屏蔽了 SIGQUIT,因此進(jìn)程不會(huì)馬上終止,它將在 SIGINT 信號處理完成后進(jìn)行。
你可以把 sa_mask 清空做一次對比,兩次的操作流程都一樣,如下
以下是運(yùn)行結(jié)果
^CCalled with signal 2
^\done handling signal 2
[N] NNN quit (core dumped) ./xxx
^CCalled with signal 2
^\[N] NNN quit (core dumped) ./xxx北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。