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 }