首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么控制台上没有信号处理输出?

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

Stack Overflow用户
提问于 2012-08-27 09:44:02
回答 1查看 3.2K关注 0票数 8

我是在Unix环境下的高级编程中尝试这个程序的。

代码语言:javascript
复制
#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;
}

我正在使用Ubuntu11.10。我和gcc一起编写了程序,然后按照书中的指示运行a.out。

$./a.out& 1+ 1345

$ kill -USR1 1345

但是没有打印输出。这个程序一直在后台运行,我得杀了它。

我尝试过的其他事情:

  1. 尝试处理SIGINT,以查看在后台运行程序是否会导致问题。还是没有输出。
  2. 下载了FreeBSD的最新版本,并在上面试用了相同的程序,但问题是相同的。
  3. 在设置信号处理程序之前,我放置了一个printf语句: int (){ printf("printf正在工作.“);//exit(0);if(信号(SIGUSR1,处理程序) == SIG_ERR) .

当exit()被注释时,就没有输出。当我取消注释时,输出将被打印出来。

请告诉我我做错了什么?

PS:不要建议使用sigaction()。我正在学习Unix编程,而不是构建任何实际的应用程序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-27 09:47:36

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

但是,应该提醒您,在信号处理程序中使用输出函数(如printf和fflush )并不安全。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12139609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档