当前位置: 技术问答>linux和unix
关于accept阻塞和alarm闹钟问题
来源: 互联网 发布时间:2017-01-17
本文导语: 我的程序中有以下几行: int flag = 1; //全局变量 int main(){ . . . signal(SIGINT,function); while(flag){ clientfd = accept(serverfd,NULL,NULL); if(clientfd == -1){ if(erro == EINTR) {fprintf(stderr,"!!!!n"); continue;} ...
我的程序中有以下几行:
int flag = 1; //全局变量
int main(){
.
.
.
signal(SIGINT,function);
while(flag){
clientfd = accept(serverfd,NULL,NULL);
if(clientfd == -1){
if(erro == EINTR) {fprintf(stderr,"!!!!n"); continue;}
.
.
.
}//if
}//while
fprintf("....n");
}//main结束
void function(int sig){
flag = 0;
alarm(5);
signal(SIGINT,SIG_DFL);
}
为什么我按了ctl+c后程序停5秒后结束,但是没有输出"!!!!" 和 "...."
求解,高手!谢谢!
int flag = 1; //全局变量
int main(){
.
.
.
signal(SIGINT,function);
while(flag){
clientfd = accept(serverfd,NULL,NULL);
if(clientfd == -1){
if(erro == EINTR) {fprintf(stderr,"!!!!n"); continue;}
.
.
.
}//if
}//while
fprintf("....n");
}//main结束
void function(int sig){
flag = 0;
alarm(5);
signal(SIGINT,SIG_DFL);
}
为什么我按了ctl+c后程序停5秒后结束,但是没有输出"!!!!" 和 "...."
求解,高手!谢谢!
|
LZ的程序之所以没有输出,因为没有设置SIGALRM信号的信号处理函数,当SIGALRM信号发生时,默认动作是终止程序;第二,accpet在信号发生时,是被中断了的,并且会去调用中断处理程序,只不过accpet被中断后,又被操作系统自动重启了,表现出来就好像没有被中断一样,也就不会有返回,自然不会执行accpet之后对errno的判断。
|
说明accept没返回,还堵在那呢,(你可以在accept下面加句打印clientfd的,应该都不会执行)程序捕获SIGINT信号后,就等着超时结束了
有点奇怪的是记得以前在AIX上搞过类似的accept是有返回-1的,按这样来说以上例子因该是会打印,并且程序也不会sleep5秒,程序会立刻结束
所以说这个最好还是要去翻翻资料的,按lz的描述应该是以上第一种情况
有点奇怪的是记得以前在AIX上搞过类似的accept是有返回-1的,按这样来说以上例子因该是会打印,并且程序也不会sleep5秒,程序会立刻结束
所以说这个最好还是要去翻翻资料的,按lz的描述应该是以上第一种情况
|
估计程序异常终止了吧
你没有设置alarm信号的处理动作
加一段
void foo(int a) {}
signal(SIGALRM,foo);
你没有设置alarm信号的处理动作
加一段
void foo(int a) {}
signal(SIGALRM,foo);
|
我也遇到过,发现很多函数都不会被信号中断.
你只能用select来做超时了。
|
闹钟信号缺省行为是终止程序
你加一下信号处理函数看啊