当前位置: 技术问答>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次数'
各位大虾,为何信号处理程序不能实时响应.....书上说可以的啊,我想也是一定可以的,
..这下睡不着觉了..
(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" 试试。
printf("received signal number : %d",signum);
的后边加上一行
fflush( stdout );
编译一遍再看看有没有咚咚出来?
unix底下的标准输出是由缓冲的,所以有时不能及时的输出,但是标准错误输出不缓冲,你还可以把程序中的所有 "printf( ", 改成"fprintf( stderr" 试试。