免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2351 | 回复: 1
打印 上一主题 下一主题

IO操作被中断EINTR [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-03 05:01 |只看该作者 |倒序浏览
UNIX网络编程中有这样一个函数,实现读取n字节。

ssize_t readn( int fd, void *vptr, size_t n )
{
        size_t nleft;
        ssize_t nread;
        char *ptr;

        ptr=vptr;
        nleft=n;
        while( nleft>0 ) {
                if( (nread=read(fd, ptr, nleft))<0 ) {
                        if( EINTR==errno )
                                nread=0;                               //注意这里!
                        else return -1;
                }//if
                else if( nread==0 ) break;
                nleft-=nread;
                ptr+=nread;
        }//while
        return n-nleft;
}


不明白为read被信号中断,就是返回EINTR后为什么让读取字节数nread为0,这样nleft不变。就是要重新读取?
如果在网络通信中,部分数据已接收时read被中断,那么这样已经读取的数据也会作废,而要全部重读吗?若发送方已经将这部分数据删除怎么办?

论坛徽章:
0
2 [报告]
发表于 2010-08-04 17:00 |只看该作者
UNIX网络编程中有这样一个函数,实现读取n字节。

ssize_t readn( int fd, void *vptr, size_t n )
{
         ...
bfyviolin 发表于 2010-08-03 05:01



EINTR  Interrupted function call (POSIX.1)

也就是说,系统在处理中断,这个时候你原来的数据会被覆盖,你之前读的一半数据也没用了,要重新读取!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP