Chinaunix首页 | 论坛 | 博客
  • 博客访问: 159500
  • 博文数量: 29
  • 博客积分: 1015
  • 博客等级: 上士
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-22 12:30
个人简介

喜读书,尤好史。

文章分类

全部博文(29)

文章存档

2012年(10)

2011年(19)

分类:

2011-12-21 15:16:55

相应的博客地址:http://www.cnblogs.com/hnrainll/archive/2011/07/27/2117864.html


在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted system call. 这里给出一个connect连接中对EINTR处理的网址:

~david/computers/connect-intr.html

另外转载网络上其他兄弟对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错误。

阅读(963) | 评论(0) | 转发(0) |
0

上一篇:busybox下自制文件系统

下一篇:链接脚本

给主人留下些什么吧!~~