为什么控制台上没有输出信号处理?

Sha*_*ain 5 c unix linux signals

我正在Unix环境中的高级编程中尝试这个程序.

#include<stdio.h>
#include<signal.h>

static void handler(int sig){
    if(sig == SIGUSR1)
        printf("handled user1 signal");
    else if(sig == SIGUSR2)
        printf("handles user2 signal");
    else
        printf("unkown signal");
}

int main(){

    if(signal(SIGUSR1, handler) == SIG_ERR)
        printf("can't handle signal SIGUSR1");
    if(signal(SIGUSR2, handler) == SIG_ERR)
        printf("can't handle signal SIGUSR2");
    for(;;)
        pause();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Ubuntu 11.10.我用gcc编译程序,然后运行a.out,如书中所示.

$./ a.out&[1] + 1345

$ kill -USR1 1345

但是没有打印输出.该程序继续在后面运行,我必须杀死它.

我试过的其他事情:

  1. 尝试处理SIGINT以查看在后台运行程序是否导致问题.仍然没有输出.

  2. 下载了FreeBSD的最新版本并尝试了同样的程序,但遇到了同样的问题.

  3. 我在设置信号处理程序之前放了一个printf语句:

    int main(){
        printf("printf is working...");
        //exit(0);
        if(signal(SIGUSR1, handler) == SIG_ERR)
        ...
    
    Run Code Online (Sandbox Code Playgroud)

注释exit()时,没有输出.取消注释后,将打印输出.

请告诉我这是我做错了什么?

PS:不建议使用sigaction().我正在学习Unix编程,没有构建任何实际的应用程序.

Som*_*ude 11

printf缓冲输出.这意味着它被存储在内存中,直到刷新到输出.刷新文本的最佳方法printf是使用换行符结束文本.您也可以使用该fflush功能手动刷新.

但是,你应该提醒说,使用输出功能,如printffflush没有考虑在信号处理程序安全.

  • 学习是学习不在信号处理程序中使用不安全函数的最佳时机.有关安全功能的列表,请访问http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html使用`write`代替`printf/fflush`. (2认同)