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

我正在Unix环境的Advanced 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编程,而不是构建任何实际应用程序。

回答:

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

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

以上是 为什么控制台上没有信号处理输出? 的全部内容, 来源链接: utcz.com/qa/409401.html

回到顶部