当前位置: 技术问答>linux和unix
使用socket的accept()函数时Interrupted system call问题
来源: 互联网 发布时间:2016-07-21
本文导语: 程序执行到accept时报错Interrupted system call,如果注释掉checkNode()就可以执行,请问这是怎么回事? int main() { ... /*定时检测节点是否存活*/ checkNode(); ... while(1) { if((client_f...
程序执行到accept时报错Interrupted system call,如果注释掉checkNode()就可以执行,请问这是怎么回事?
int main()
{
...
/*定时检测节点是否存活*/
checkNode();
...
while(1)
{
if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){
perror("accept socket error");
exit(1);
}
...
}
...
}
checkNode代码为:
checkNodeAlive函数代码
也试过在accept()函数里加上
if (errno == EINTR) continue;
那么运行的时候提示Alarm clock就结束了。
int main()
{
...
/*定时检测节点是否存活*/
checkNode();
...
while(1)
{
if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){
perror("accept socket error");
exit(1);
}
...
}
...
}
checkNode代码为:
void checkNode( )
{
int res = 0;
// Register checkNodeAlive to SIGALRM
signal(SIGALRM, checkNodeAlive);
struct itimerval tick;
// Initialize struct
memset(&tick, 0, sizeof(tick));
// Timeout to run function first time
tick.it_value.tv_sec = 3; // sec
tick.it_value.tv_usec = 0; // micro sec.
// Interval time to run function
tick.it_interval.tv_sec = 30;
tick.it_interval.tv_usec = 0;
// Set timer, ITIMER_REAL : real-time to decrease timer,
res = setitimer(ITIMER_REAL, &tick, NULL);
if (res) {
printf("Set timer failed!!n");
exit(1);
}
}
checkNodeAlive函数代码
void checkNodeAlive(int num)
{
printf("setitimer");
return;
}
也试过在accept()函数里加上
if (errno == EINTR) continue;
那么运行的时候提示Alarm clock就结束了。
|
void checkNodeAlive(int num)
{
printf("setitimer");
return;
}
加一行变成
void checkNodeAlive(int num)
{
signal(SIGALRM, checkNodeAlive);
printf("setitimer");
return;
}
|
Linux所有的阻塞式系统调用都会跟信号中断,所以accept报Interrupted system call很正常,因为你的设置了定时信号。当时间到的时候本进程会收到SIGALRM信号,从而accept被中断。
|
exit(1); 去掉,或者改成break