gpt4 book ai didi

c - 为什么控制台上没有关于信号处理的输出?

转载 作者:IT王子 更新时间:2023-10-29 01:08:57 24 4
gpt4 key购买 nike

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

最佳答案

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

但是,您应该注意使用像 printffflush 这样的输出函数在信号处理程序中被认为是不安全的。

关于c - 为什么控制台上没有关于信号处理的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com