c - 你好,关于《APUE》中10.11的信号源

标签 c linux

我看了《APUE》,我发现10.11的例子不能创建正确的答案。 10.11 文件是:

static void sig_quit( int );

int main( void )
{
        sigset_t newmask, oldmask, pendmask;

        if ( signal( SIGQUIT, sig_quit ) == SIG_ERR )
                err_sys( "can't catch SIGQUIT" );

        sigemptyset( &newmask );
        sigaddset( &newmask, SIGQUIT );

        /* block SIGQUIT and save current signal mask */
        if ( sigprocmask( SIG_BLOCK, &newmask, &oldmask ) < 0 )
                err_sys( "SIG_BLOCK error" );

        sleep( 5 );     /* SIGQUIT here will remain pending */

        if ( sigpending( &pendmask ) < 0 )
                err_sys( "sigpending error" );
        if ( sigismember( &pendmask, SIGQUIT ) )
                printf( "\nSIGQUIT pengding\n" );

        /* reset signal mask which unblocks SIGQUIT */
        if ( sigprocmask( SIG_SETMASK, &oldmask, NULL ) > 0 )
                err_sys( "SIG_SETMASK error" );
        printf( "SIGQUIT unblocked\n" );

        sleep( 5 );     /* SIGQUIT here will terminate with core file */

        exit( 0 );
}

static void sig_quit( int signo )
{
        printf( "caught SIGQUIT\n" );

        if ( signal( SIGQUIT, SIG_DFL ) == SIG_ERR )
                err_sys( "can't reset SIG_QUIT" );

        return ;
}

当我执行 ./a.out 并在不到 5 秒内键入 ctrl+c 时,程序将立即结束。 如果它在《APUE》中以正确的方式工作,它会打印:

^\
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
^\Quit(coredump) 

我是一个学习信号的新人。请问我如何理解为什么? 当出现其他错误时,我可以使用 gdb。但是信号,所以请,谢谢 我在 ubuntu 10.04 上工作

最佳答案

CTRL+C 生成SIGINTCTRL-\ 生成SIGQUIT。参见 Termination Signals - the GNU C Library

关于c - 你好,关于《APUE》中10.11的信号源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646043/

相关文章:

c# - float 问题 : C++ to C# migration

linux - 更正 "nice"批处理程序的 POSIX 调度优先级

php - 源代码用apache出现,为什么要修复?

linux - gnome-terminal:如何关闭原始选项卡?

c - 从 C 可执行文件增加 ext4 文件系统上 linux 文件大小而不在文件中创建漏洞的最快方法是什么?

c - 在 C 中对字符数组进行 alpha 排序的最简单方法是什么?

linux - grep 特定字符串(多个)目录中的所有 Bean.java 文件(不区分大小写)

linux - perl 解压单个文件

c - 我传递的是我的 char 数组的副本还是指针?

c - case 和 default 是否被视为陈述?