linux socket 错误处理,Linux - socket编程处理EINTR错误

在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted

system call. 这里给出一个connect连接中对EINTR处理的网址:

另外转载网络上其他兄弟对EINTR错误的处理:

1.

accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。所以使用时应这样:(网址:)

while(1)

{

if ((connfd = accept(....)) == -1)

{

if (errno == EINTR)

{

continue;

}

perror("accept()");

exit(1);

}

//do something with the connfd

......;

}

2. 引用网址 ,其中摘引一段socket的读处理,我把排版做了相应改动:

int my_read(int fd,

void *buffer, int length)

{

int bytes_left;

int bytes_read;

char *ptr = NULL;

bytes_left = length;

while (bytes_left > 0)

{

bytes_read = read(fd, ptr, bytes_read);

if (bytes_read < 0)

{

if (errno == EINTR)

{

bytes_read = 0;

}

else

{

return(-1);

}

}

else if (0 == bytes_read)

{

break;

}

bytes_left -= bytes_read;

ptr += bytes_read;

}

return(length-bytes_left);

}

这个只能针对阻塞模式的socket,非阻塞模式的socket好要处理EAGAIN错误。

摘自 http://blog.sina.com.cn/s/blog_5acb430f0100aer1.html