write函数
头文件:#include <unistd.h>
原型:size_t write(int fd, const void *buf, size_t nbytes);
返回值:若成功返回已写的字节数,若出错,返回-1。
其返回值通常与nbytes的值相同,否则表示出错,write出错的一个常见的原因是磁盘已经写满,或者超出了一个给定进程的文件长度限制。
对于普通文件,写操作从文件的当前偏移量开始。如果在打开文件时,指定了O_APPEND选项,则在每次写操作之前,将文件偏移量这是在文件的当前结尾处。在一次成功写入之后,该文件偏移量增实际写的字节数。
前提条件是:TCP底层封装接口,write函数使用默认的阻塞状态,向TCP底层socket写数据。
建议将write函数使用默认的阻塞方式,写数据到底层接口,这样即便是遇到中断,也不会出现写失败。
如果write已经传输了应用程序缓冲区中的部分数据,然后被中断,操作系统可以认为该系统调用(write写)失败,并将errno设置为EINTR;另一种处理方式是允许该系统调用成功返回,返回值是已经写的部分数据量。
下面的代码是write写操作的一部分:
do{
ret = write(fd, buf + len_sent, len - len_sent);
l_error = errno; //防止其他操作,把errno的值修改了,临时变量保存
DEBUG_MSG("write return:%d,errno:%d", len_sent, l_error);
if (ret > 0){
len_sent += ret;
}
else if (l_error == EINTR)
{
continue;
}
else
{
return -1;
}
}while(len > len_sent);