write函数
函数定义如下:
> #include <unistd>
> ssize_t write(int filedes, void *buf, size_t nbytes);
> // 返回:若成功则返回写入的字节数,若出错则返回-1
> // filedes:文件描述符
> // buf:待写入数据缓存区
> // nbytes:要写入的字节数
函数描述:
write()函数尝试从缓冲器中向文件描述符所代表的文件中的偏移量后写入buf中的nbyte字节。
如果write()在写任何数据之前被一个信号中断将以errno设置为EINTR。
如果write()在成功写入某些信息后被一个信号中断数据,它将返回写入的字节数。
如果nbyte的值大于ssizemax,结果就会出现mentation-defined。
如果文件有数据,而且文件偏移量不在文件尾部,这时候调用write时会覆盖文件中的内容。
函数返回值
成功完成后,这些函数将返回字节实际上写入与fildes关联的文件。这个数字永远不会大于nbyte。否则,将返回-1,并设置errno来表示错误。
ERRNO:
EAGAIN:这表明你在非阻塞模式下调用了阻塞操作。
EBADF:fildes参数并不是有效文件描述符。
EINTR:中断系统调用。
EIO:I/O错误
ENOSPC:此设备上无剩余空间
ERANGE:数字无法表示的结果
EPIPE:错误的管道
ECONNRESET:向一个没有连接的套接字进行写操作
为了保证写入数据的完整性,对wite进行封装:
ssize_t writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while( nleft > 0 )
{
if( (nwritten = write(fd, ptr, nletf)) <=0 )
{
if( nwritten < 0 && errno == EINTR )
{
nwritten = 0;
}
else
{
return -1;
}
}
nleft -= nwritten;
ptr += nwritten;
}
}