【发布时间】:2012-08-21 19:13:34
【问题描述】:
我在 Unix Environment 中的 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
但是没有打印输出。程序一直在后台运行,我必须杀死它。
我尝试过的其他事情:
尝试处理 SIGINT 以查看在后台运行的程序是否导致问题。还是没有输出。
下载了最新版本的 FreeBSD 并在上面尝试了相同的程序,但遇到了同样的问题。
-
我在设置信号处理程序之前放了一条 printf 语句:
int main(){ printf("printf is working..."); //exit(0); if(signal(SIGUSR1, handler) == SIG_ERR) ...
当exit() 被注释时,没有输出。当我取消注释时,将打印输出。
请告诉我我做错了什么?
PS:不建议使用 sigaction()。我正在学习 Unix 编程,而不是构建任何实际应用程序。
【问题讨论】:
-
怀疑你需要刷新标准输出,因为它是缓冲的。但是,在信号处理程序中可以做的事情是有限制的(我会尝试找到有人给我的详细说明这一点的链接)。
-
正确的建议不是
sigaction(),而是signalfd和epoll:-) 那会让你对Linux编程变得认真。 -
@hmjd - 感谢您的回复。是的,输出被缓冲并将换行符放在语句的末尾
-
要么调用
fflush(0),要么在字符串末尾添加\n