Linux系统调用 - write

本文详细解析了Linux系统中的write()系统调用,包括其函数原型、参数含义及返回值解读。探讨了在不同情况下write()可能返回的错误代码及其原因,如EBADF、EFAULT、EFBIG等,以及如何正确处理这些错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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系统编程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值