c - 了解管道/FIFO 是否已满

4 c pipe named-pipes systems-programming

我有一个作为 RDWR(用于通信进程-进程)和管道(进程-线程)打开的 fifo,我如何理解何时达到管道或 fifos 限制?当我尝试写入超过 64 KB 时,它只是在 write() 中等待。

Joh*_*nck 5

您需要使用非阻塞模式:

pipe2(fds, O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要在创建管道后执行此操作:

int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)

现在,当您读取或写入并且操作无法立即完成时,它将返回。然后您可以使用select()poll()找出何时可以再次读取或写入(或者您可以只是忙等待)。

  • 它将返回 `-1` 并将 `errno` 设置为 `EAGAIN` — POSIX [`write()`](http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html) 说:_A {PIPE_BUF} 或更少字节的写请求应具有以下效果:如果管道中有足够的可用空间,则 write() 应传输所有数据并返回请求的字节数。否则,write() 将不传输数据并返回 -1,并将 errno 设置为 [EAGAIN]._ (3认同)
  • 我应该注意,我引用的描述特别适用于设置了 O_NONBLOCK 标志的管道或 FIFO——阅读规范的其余部分了解其他情况下的行为。 (2认同)