博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字节流套接口的读写
阅读量:7225 次
发布时间:2019-06-29

本文共 1845 字,大约阅读时间需要 6 分钟。

 字节流套接口上的read和write函数的使用与普通的I/O操作不同。由于内核中套接口的缓冲区是一个有限的空间,当这个缓冲空间不足以存储你要接收或发送的数据时,函数返回的字节数就会比预期发送的字节数少。这时,再次把剩余的数据操作一次即可。

  为了预防缓冲区空间不足的情况,可以调用readn、writen、readline、writelin函数

readn函数:从一个描述字读n个字节

// return readn numberssize_t readn(int fd, void* vptr, size_t n){    size_t nleft;    size_t nread;    char*  ptr;    ptr   = vptr;    nleft = n;    while(nleft > 0){        if((nread = read(fd, vptr, nleft)) < 0){            if(errno == EINTR)             //由于信号中断,没读成功任何数据                nread = 0;            else                return -1;        }        else if(nread == 0)            break;                         //EOF                nleft -= nread;        ptr   += nread;    }        return (n - nleft);}

writen函数:往一个描述字写n字节

ssize_t writen(int fd, const void *vptr, size_t n){    size_t nleft;    size_t nwriten;    const void *ptr;        ptr = vptr;    nleft = n        while(nleft > 0){        if((nwriten = write(fd, ptr, nleft)) <= 0){            if(nwriten < 0 && errno == EINTR)  //由于信号中断,没写成功任何数据                nwriten = 0;            else                return -1;        }                nleft -= nwriten;        ptr   += nwriten;    }        return (n);}

readline函数:从一个描述字读文本,一次1个字节

ssize_t readline(int fd, void *vptr, size_t maxlen){    ssize_t n, rc;    char     c, *ptr;        ptr = vptr;        for(n = 1; n < maxlen; ++n){        again:            if((rc = read(fd, &c, 1)) == 1){                *ptr++ = c;                if(c == '\n') //以'/n'结束                    break;            }            else if(rc == 0){                *ptr = 0;                return n -1;            }            else{                if(errno == EINTR)                    goto again;                return -1;            }    }        *ptr = 0;    return n;}

 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/3468873.html,如需转载请自行联系原作者

你可能感兴趣的文章
PyCharm搭建GO开发环境(GO语言学习第1课)
查看>>
Android交互
查看>>
提醒我喝水chrome插件开发指南
查看>>
列表数据转树形数据
查看>>
Java新版本的开发已正式进入轨道,版本号18.3
查看>>
从零开始的webpack生活-0x009:FilesLoader装载文件
查看>>
在electron中实现跨域请求,无需更改服务器端设置
查看>>
gitlab-ci配置详解(一)
查看>>
听说你叫Java(二)–Servlet请求
查看>>
案例分享〡三拾众筹持续交付开发流程支撑创新业务
查看>>
FreeWheel业务系统微服务化过程经验分享
查看>>
移动互联网下半场,iOS开发者如何“高薪”成长?
查看>>
Atlassian是怎样进行持续交付的?且听 Steve Smith一一道来
查看>>
Web Storage相关
查看>>
[PHP内核探索]PHP中的哈希表
查看>>
Apache-drill Architechture
查看>>
WordPress 5.2 Beta 3 发布,要求 PHP 5.6.20 以上版本
查看>>
通通连起来——无处不在的流
查看>>
互联网+时代,看云计算如何改变传统行业
查看>>
ZFS ARC & L2ARC zfs-$ver/module/zfs/arc.c
查看>>