当前位置:  技术问答>linux和unix

关于signal()系统调用

    来源: 互联网  发布时间:2014-11-13

    本文导语:  我在rh7.1中编译运行下面代码时有点疑问,请各位帮忙啦! (from 'linux a-z'.author:phil cornes) #include  #include  #include  void ctrl_c(int); int ctrl_c_count=0; void (*old_handle)(int); main() { int c; old_handle=signal(SIGINT,ctrl_c); while((c=getchar()...

我在rh7.1中编译运行下面代码时有点疑问,请各位帮忙啦!
(from 'linux a-z'.author:phil cornes)
#include 
#include 
#include 

void ctrl_c(int);
int ctrl_c_count=0;
void (*old_handle)(int);

main()
{
int c;
old_handle=signal(SIGINT,ctrl_c);
while((c=getchar())!='n');
printf("ctrl-c count=%d n",ctrl_c_count);

(void)signal(SIGINT,old_handle);
for(;;);


}


void ctrl_c(int signum)
{
(void)signal(SIGINT,ctrl_c);
++ctrl_c_count;
printf("received signal number : %d",signum);

}

调用signal(SIGINT,ctrl_c)后应该可以捕获ctrl-c信号,并立即运行处理程序ctrl_c();

可运行结果是,如不键入'n'回车符,则一直在
while((c=getchar())!='n');
中,其间ctrl-c也不能运行处理程序ctrl_c();(不打印printf("received signal number : %d",signum);)
键入'n'回车符,输出received signal number : 2(次数为按ctrl-c次数)  ctrl-c count='按ctrl-c次数'
各位大虾,为何信号处理程序不能实时响应.....书上说可以的啊,我想也是一定可以的,
..这下睡不着觉了..

|
呵呵呵。还以为linux底下的信号量不一样呢,到最后才发现是标准输出缓冲的问题,你在 void ctrl_c()的最后,即

printf("received signal number : %d",signum);

的后边加上一行

fflush( stdout );

编译一遍再看看有没有咚咚出来?

unix底下的标准输出是由缓冲的,所以有时不能及时的输出,但是标准错误输出不缓冲,你还可以把程序中的所有 "printf( ", 改成"fprintf( stderr" 试试。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util.concurrent.locks接口condition的类成员方法: signal定义及介绍
  • signal 7和signal 11
  • 请教signal函数的用法!
  • linux iis7站长之家
  • signal函数定义该怎么理解?
  • 关于signal返回值是什么?
  • pending signal
  • 关于Linux驱动中signal的使用
  • signal函数的定义问题?搞不懂.
  • about "signal"
  • 有关signal handler,请教!
  • 关于signal函数
  • signal函数使用出问题?
  • 关于signal函数的问题
  • signal handler 问题
  • signal的疑惑
  • signal的处理函数问题
  • signal 函数请教
  • 关于signal函数的问题,大家帮我看看
  • 关于signal ()
  • signal和sigaction区别


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,