为什么控制台上没有信号处理输出?
我正在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
但是没有输出输出。该程序一直在后台运行,我必须杀死它。
我尝试过的其他方法:
尝试处理SIGINT以查看在后台运行程序是否引起问题。仍然没有输出。
下载了最新版的FreeBSD,并尝试了相同的程序,但是存在相同的问题。
我在设置信号处理程序之前放了一个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