在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted system call. 这里给出一个connect连接中对EINTR处理的网址:
http://www.madore.org/~david/computers/connect-intr.html 另外转载网络上其他兄弟对EINTR错误的处理: 1. accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。所以使用时应这样:(网址:http://bbs.loveunix.net/viewthread.php?tid=36154) while(1) { if ((connfd = accept(....)) == -1) { if (errno == EINTR) { continue; } perror("accept()"); exit(1); } //do something with the connfd ......; } 2. 引用网址 http://fanqiang.chinaunix.net/a4/b7/20010508/112052.html,其中摘引一段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