Linux数据写操作改进

  Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内核缓冲区写入了len个数据。比如当内核socket缓冲区不足,小于len个字节,则会只写入其中的一部分,返回nwrite表示实际写入的字节数:因为这种读写方式可以保证数据全部写入缓冲区,因此实际返回值只有-1表示写入错误,size表示完全写入缓冲区。

  为了保证数据写入的完整性,采用循环的写入是非常必要的,下面是参考代码:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <errno.h>
 4 #include <iostream>
 5 using namespace std;
 6 ssize_t writen(int fd, void* buf, size_t size)
 7 {
 8     char *ptr = (char*)buf;
 9     int nleft = (int)size;
10     int nwritten;
11     while (nleft > 0)
12     {
13         nwritten = write(fd, ptr, nleft);
14         if (nwritten <= 0)
15         {
16             if (nwritten < 0 && errno&EINTR)//发生该错误则继续进行读或写操作
17             {
18                 nwritten = 0;    //write again
19             }
20             else 
21                 return -1; //error
22         }
23         nleft -= nwritten;
24         ptr += nwritten;
25     }
26     return size;
27 }

 

转载于:https://www.cnblogs.com/shenshenlei/p/5528247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值