gpt4 book ai didi

linux - write() 到文件什么时候返回 EWOULDBLOCK?

转载 作者:可可西里 更新时间:2023-11-01 11:49:50 24 4
gpt4 key购买 nike

我想经常将数据附加到本地文件系统上的文件中。我想在不阻塞太久的情况下执行此操作,并且不创建任何工作线程。在 Linux 内核 2.6.18 上。

似乎 Linux 上 glibc 的 POSIX AIO 实现创建了一个用户空间线程池并阻塞了这些线程。这很酷,但我可以轻松地分离出我自己的专用文件阻塞线程。

据我了解,Linux 内核 AIO 实现当前会在追加时阻塞。附加是我唯一想做的事情。

我正在考虑使用 O_NONBLOCK 打开文件,然后进行一种惰性写入,如果它是 EWOULDBLOCK,则稍后再尝试写入。像这样:

  1. 打开(路径名,O_CREAT | O_APPEND | O_NONBLOCK);
  2. 调用write(),检查错误EAGAIN | EWOULDBLOCK
  3. 如果 EAGAIN | EWOULDBLOCK,然后只需保存要写入的数据,稍后再尝试 write()

这是个好主意吗?这有什么实际好处吗?如果我是唯一一个拥有该文件的打开文件描述符的人,并且我尝试了一个 write() 并且它是 EWOULDBLOCK,那么它是否不太可能 EWOULDBLOCK 稍后?它会不会EWOULDBLOCK?如果我 write() 但它没有 EWOULDBLOCK,这是否意味着 write() 会迅速返回?

换句话说,在什么情况下,如果有的话,在 Linux 2.6.18 上 write() 到本地文件会失败并返回 EWOULDBLOCK

最佳答案

我不确定本地文件系统,但我很确定在尝试写入挂载文件系统(例如 nfs)上的文件时,您可以得到 EWOULDBLOCK。这里的问题是,通常你不知道它是否真的是“本地”硬盘,除非你每次创建/打开文件时都专门检查一下。如何检查这当然取决于系统。

即使系统创建一些额外的线程来执行实际的写入,该线程也会有一个缓冲区(不会是无限的),因此如果您的写入速度足够快,您可能会遇到 EWOULDBLOCK。

关于linux - write() 到文件什么时候返回 EWOULDBLOCK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14476201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com