【问题标题】:Why no output on console on signal handling?为什么控制台上没有关于信号处理的输出?
【发布时间】:2012-08-21 19:13:34
【问题描述】:

我在 Unix Env​​ironment 中的 Advance Programming 中尝试了这个程序。

#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

$ kill -USR1 1345

但是没有打印输出。程序一直在后台运行,我必须杀死它。

我尝试过的其他事情:

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

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

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

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

当exit() 被注释时,没有输出。当我取消注释时,将打印输出。

请告诉我我做错了什么?

PS:不建议使用 sigaction()。我正在学习 Unix 编程,而不是构建任何实际应用程序。

【问题讨论】:

  • 怀疑你需要刷新标准输出,因为它是缓冲的。但是,在信号处理程序中可以做的事情是有限制的(我会尝试找到有人给我的详细说明这一点的链接)。
  • 正确的建议不是sigaction(),而是signalfdepoll :-) 会让你对Linux编程变得认真。
  • @hmjd - 感谢您的回复。是的,输出被缓冲并将换行符放在语句的末尾
  • 要么调用fflush(0),要么在字符串末尾添加\n

标签: c linux unix signals


【解决方案1】:

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

但是,您应该注意,在信号处理程序中使用 printffflush 等输出函数并不安全。

【讨论】:

  • 是的,我知道,它们不是可重入函数。但是,我只是将它们用于学习目的。
  • 学习是学习不要在信号处理程序中使用不安全函数的最佳时机。安全功能列表可在pubs.opengroup.org/onlinepubs/009695399/functions/… 获得,只需使用write 而不是printf/fflush
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
相关资源
最近更新 更多