为什么对信号处理的控制台没有输出?(Why no output on console on sign

2019-06-27 10:20发布

我试图从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;
}

我使用Ubuntu 11.10。 我编译程序用gcc,然后运行的a.out在书中指出。

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

$杀-USR1 1345

但没有输出打印。 该计划一直在backgound运行,我要杀死它。

其他的事情我已经尝试:

  1. 试图处理SIGINT,看是否在后台运行的程序导致的问题。 仍然没有输出。

  2. 下载的FreeBSD的最新版本,并试图在其上的相同程序,但是具有同样的问题。

  3. 我把printf语句设定信号处理程序之前:

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

当出口()被注释,没有输出。 当我去掉它,输出被打印。

请告诉我,我在做什么错呢?

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

Answer 1:

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

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



文章来源: Why no output on console on signal handling?