码迷,mamicode.com
首页 > 系统相关 > 详细

Linux数据写操作改进

时间:2016-05-25 20:44:44      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

  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 }

 

Linux数据写操作改进

标签:

原文地址:http://www.cnblogs.com/shenshenlei/p/5528247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!