Linux系统调用 - write

write()系统调用向指定的文件描述符内写入指定字节数的内容,函数原型:

ssize_t write(int fd, const void *buf, size_t count);

其中参数count表示最多写入的字节数,返回值表是真正写入的字节数。有些情况下返回值有可能会比指定的字节数要少,例如存储设备上没有空间了,或者写入的文件大小超过RLIMIT_FSIZE的限制了,或者写入过程被信号中断了等等。如果写入的是一个常规文件,写入会发生在当前偏移指针指向的位置,并会在写入完成后把偏移指针后移实际写入的字节数。内核中实现的写入和调整偏移指针的操作是原子的,应用程序不需要担心写入被打断时指针偏移与写入内容不匹配的问题。

如果遇到错误,write()会返回-1,与read()系统调用一样,并不是所有的情况下返回-1就表示文件坏了,写不了了,还需要继续检查errno来确定出错的原因。例如,如果当操作一个非阻塞模式的socket时,errno等于EAGAIN和EWOULDBLOCK通常意味着当前的socket还发不了数据,但是如果等一会再来尝试发一次,有可能又可以发了。所以对这两种错误,应用总是应该稍后再次尝试。还有EINTR错误,表示在成功写入任何数据之前就刚好被某个信号打断了,这时候也应该在信号处理完成后再次尝试写入。

另外还有一些其他常见的错误:

       EBADF:指定的文件描述符无效,或不能写入

       EFAULT:指定的buf无法访问

       EFBIG:文件内容在写入count个字节之后就会太大了,或者写入的位置超过了允许的偏移范围,返回这种错误的时候,不会有任何的数据真正写入到文件里面。

       EINVAL:指定的文件描述符不能写入。另外如果打开的文件指定了O_DIRECT标志,那么写入操作会直接刷新到存储设备,而不会为这个文件创建内核中的写入缓冲区,这时候,传入的写入数据地址和字节数都需要按照磁盘页的大小对齐,如果传入的参数是没有对齐的,也会返回这种错误。

       EIO:当修改文件的iNode时遇到一个底层IO错误。 

      ENOSPC:文件所在的设备没有足够的空间了。

猜你喜欢

转载自blog.csdn.net/yubo112002/article/details/82995469