Linux write 函数深入了解

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值