当前位置:   article > 正文

Linux系统调用 - write_linux 调用系统函数write的流程

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:文件所在的设备没有足够的空间了。

 

==================== 以下是广告 ====================

更多系统详尽的Linux系统编程内容,欢迎订阅GitChat专栏 《攻克Linux系统编程》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/278443
推荐阅读
相关标签
  

闽ICP备14008679号