printf 函数为什么没有输出???

微信公众号 2012-12-01 04:10:33
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

void handler_sigtime(int signu)
{
switch(signu)
{
case SIGALRM:
printf("receive signal SIGALRM\n");
break;
case SIGPROF:
printf("receive signal SIGPROF\n");
break;
default:
printf("the signu is :%d",signu);
break;
}
}

int main(void)
{
printf("------Main Starting----");
struct itimerval value;

signal(SIGALRM,handler_sigtime); //安装信号处理函数
signal(SIGPROF,handler_sigtime);

value.it_value.tv_sec=1;
value.it_value.tv_usec=0;
value.it_interval.tv_sec=3;
value.it_interval.tv_usec=0;

// setitimer(ITIMER_REAL,&value,NULL); //为了便于查看,我把这两行定时器注释掉了
// setitimer(ITIMER_PROF,&value,NULL);
while(1);

return 0;
}

我在测试的时候,为什么程序已经走到了while循环,“Main starting”却并没有输出呢???难道是定时器和信号处理函数把printf阻塞了吗???谁能详细解释一下
...全文
2127 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hznat 2012-12-01
  • 打赏
  • 举报
回复 2
用printf()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。 1. 使用fflush(stdout)强制刷新。 2.缓冲区已满。 3.scanf()要在缓冲区里取数据时会先将缓冲区刷新。 4.\n,\r进入缓冲区时。 5.线程结束的时候,如果该线程里也有printf(....); 6. 程序结束时。
  • 打赏
  • 举报
回复
引用 5 楼 jiajiayouba 的回复:
引用 3 楼 ashi198866 的回复:printf的内容放在缓冲区里面还没有刷出来 原则上是缓冲区满了以后才输出,成为标准输出流,不过你可以在printf后面加一个fflush(stdout);这样就能立即输出来了嗯嗯,我加上fflush(stdout);后,就显示出来了。那为什么用while循环一直存在缓冲区呢?
引用 5 楼 jiajiayouba 的回复:
引用 3 楼 ashi198866 的回复:printf的内容放在缓冲区里面还没有刷出来 原则上是缓冲区满了以后才输出,成为标准输出流,不过你可以在printf后面加一个fflush(stdout);这样就能立即输出来了嗯嗯,我加上fflush(stdout);后,就显示出来了。那为什么用while循环一直存在缓冲区呢?
你的printf将输出放到缓冲去以后,缓冲区没有满,之后一直在那死循环,什么已没有做,缓冲区的内容不变,当然不会出来了,如果说程序能从while里跳出来,正常退出的话,也是可以输出来的。或者是你在while里面还有其他的输出内容,让缓冲区变满的话也可以输出来。在后面加fflush和换行符都是将缓冲区里面的东西强制输出到标准流了
微信公众号 2012-12-01
  • 打赏
  • 举报
回复 1
引用 3 楼 ashi198866 的回复:
printf的内容放在缓冲区里面还没有刷出来 原则上是缓冲区满了以后才输出,成为标准输出流,不过你可以在printf后面加一个fflush(stdout);这样就能立即输出来了
嗯嗯,我加上fflush(stdout);后,就显示出来了。那为什么用while循环一直存在缓冲区呢?
微信公众号 2012-12-01
  • 打赏
  • 举报
回复
引用 1 楼 zmlovelx 的回复:
printf("------Main Starting----\n");
恩,加上换行符就可以了,能说一下原理吗?真心求解……
  • 打赏
  • 举报
回复
printf的内容放在缓冲区里面还没有刷出来 原则上是缓冲区满了以后才输出,成为标准输出流,不过你可以在printf后面加一个fflush(stdout);这样就能立即输出来了
微信公众号 2012-12-01
  • 打赏
  • 举报
回复
测试环境red hat 6.0 ;gcc 4.4.4 我自己测试了下,假设1:如果把while循环换成getchar(),printf函数就可以正常输出;假设2:如果把信号处理函数和定时器去掉,printf 函数也可以正常输出。 这是为什么呢???
帅得不敢出门 2012-12-01
  • 打赏
  • 举报
回复
printf("------Main Starting----\n");

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧