在 ENOSPC 之后写入描述符是否安全
Is it safe to write to a descriptor after ENOSPC
想象一下这种情况:
- 一个进程 (A) 通过创建大文件将数据连续写入磁盘,并使用单独的 write() 命令向其追加数据
- 另一个进程 (B),不断从磁盘中删除文件
- 假设 (B) 删除数据的速度足够快,以至于 (A) 有空间可以写入。但是,不能保证。
- 假设 (A) 尝试写入一个打开的描述符并且它获得 ENOSPC。因为 (A) 知道 (B) 应该腾出一些空间,所以 (A) 想重试写入。
问题:对于 (A),在接收到 ENOSPC 后,尝试写入它获得 ENOSPC 的相同描述符是否安全?我找不到任何关于它的信息,我想知道它是否可能取决于 OS、文件系统等
ENOSPC 没有什么特别之处。它表示写入失败,而失败的原因与设备没有足够的空闲 space 来完成操作有关。它不会使文件描述符处于错误或未定义的状态。文件描述符保持与调用前相同的状态。您可以放心地继续尝试。
请注意,您应该为短写做好准备。如果写入系统调用没有足够的 space 来完成操作而不是因 ENOSPC 而失败,它可以尽可能多地写入并 return 成功。在这种情况下,return 值将指示写入的实际字节数。
想象一下这种情况:
- 一个进程 (A) 通过创建大文件将数据连续写入磁盘,并使用单独的 write() 命令向其追加数据
- 另一个进程 (B),不断从磁盘中删除文件
- 假设 (B) 删除数据的速度足够快,以至于 (A) 有空间可以写入。但是,不能保证。
- 假设 (A) 尝试写入一个打开的描述符并且它获得 ENOSPC。因为 (A) 知道 (B) 应该腾出一些空间,所以 (A) 想重试写入。
问题:对于 (A),在接收到 ENOSPC 后,尝试写入它获得 ENOSPC 的相同描述符是否安全?我找不到任何关于它的信息,我想知道它是否可能取决于 OS、文件系统等
ENOSPC 没有什么特别之处。它表示写入失败,而失败的原因与设备没有足够的空闲 space 来完成操作有关。它不会使文件描述符处于错误或未定义的状态。文件描述符保持与调用前相同的状态。您可以放心地继续尝试。
请注意,您应该为短写做好准备。如果写入系统调用没有足够的 space 来完成操作而不是因 ENOSPC 而失败,它可以尽可能多地写入并 return 成功。在这种情况下,return 值将指示写入的实际字节数。