1

我将大约 50k 字节的数据写入文件(存储在 USB 磁盘中并安装在 linux 2.6.37. FAT32 上),该文件每 200 毫秒使用 O_NOBLOCK。write() 函数是否有返回 EAGAIN 的风险。如果是,为什么以及在什么情况下。我运行程序已经半小时了,一直没有报错。

4

2 回答 2

3

正确但已删除的答案副本:

不会。该O_NONBLOCK标志不会影响使用常规文件。

于 2013-04-17T13:20:19.733 回答
0

一些参考,为了完整起见:

这仅适用于管道;对于常规文件,它被忽略。

如果 O_NONBLOCK 标志被清除,写入请求可能会导致线程阻塞,但在正常完成时它应返回 nbyte。

如果设置了 O_NONBLOCK 标志,则应以不同方式处理 write() 请求,方法如下:

  • write() 函数不应阻塞线程。
  • {PIPE_BUF} 或更少字节的写入请求应具有以下效果:如果管道中有足够的可用空间,write() 应传输所有数据并返回请求的字节数。否则,write() 将不传输任何数据并返回 -1,并将 errno 设置为 [EAGAIN]。
  • 超过 {PIPE_BUF} 个字节的写请求将导致以下情况之一:
    • 当至少可以写入一个字节时,传输它可以传输的内容并返回写入的字节数。当读取之前写入管道的所有数据时,它应至少传输 {PIPE_BUF} 个字节。
    • 当无法写入数据时,不传输数据,并返回 -1 并将 errno 设置为 [EAGAIN]。
于 2013-04-17T13:26:40.237 回答