在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C  Linux/ 程序運(yùn)行提示 退出(吐核)

程序運(yùn)行提示 退出(吐核)

/* 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 清空做一次對比,兩次的操作流程都一樣,如下

  1. 運(yùn)行編譯的文件
  2. 按下 Ctrl + c ,這將產(chǎn)生 SIGINT 信號
  3. 待顯示出 “Called with signal 2” 時(shí),按下 Ctrl + \,這將產(chǎn)生 SIGQUIT 信號

以下是運(yùn)行結(jié)果

  • 屏蔽了 SIGQUIT
^CCalled with signal 2
^\done handling signal 2
[N]    NNN quit (core dumped)  ./xxx
  • 沒有屏蔽 SIGQUIT
^CCalled with signal 2
^\[N]    NNN quit (core dumped)  ./xxx
2017年1月27日 10:24