我在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
$ kill -USR1 1345
但是没有打印输出。该程序继续在后面运行,我必须杀死它。
我尝试过的其他事情:
尝试处理SIGINT以查看后台运行程序是否导致问题。仍然没有输出。
下载了FreeBSD的最新版本并尝试了相同的程序,但遇到同样的问题。
我在设置信号处理程序之前放了一个printf语句:
int main(){
printf("printf is working...");
//exit(0);
if(signal(SIGUSR1, handler) == SIG_ERR)
...
当注释exit()时,没有输出。取消注释后,将打印输出。
请告诉我这件事我做错了什么?
PS:不建议使用sigaction()。我正在学习Unix编程,没有构建任何实际的应用程序。
答案 0 :(得分:11)
printf
的输出被缓冲。这意味着它被存储在内存中,直到刷新到输出。在printf
中刷新文本的最佳方法是使用换行符结束文本。您也可以使用fflush
功能手动刷新。
但是,请注意,使用printf
和fflush
等输出函数在信号处理程序中不被认为是安全的。