管道编写器可以判断阅读器何时阻塞吗?

Posted

技术标签:

【中文标题】管道编写器可以判断阅读器何时阻塞吗?【英文标题】:Can a pipe writer tell when a reader is blocking? 【发布时间】:2012-03-07 16:28:46 【问题描述】:

一个正在写入管道的进程能否判断一个读取器(在不同的进程中)何时因为试图从管道中读取而管道当前为空而阻塞?

如果使用管道无法做到这一点,是否可以使用其他形式的 IPC?

我怀疑答案是否定的,但我想我还是会问。

这种情况的用例是仅在读取器真正需要数据时才写入管道。

【问题讨论】:

管道有一个大小(例如 Linux 上的 64Kb)。一旦你填充了一个管道,写入器就会阻塞,所以当不需要数据时它不会写入。 这个问题的重点是,除非需要数据,否则我什至不想填充管道。 【参考方案1】:

据我所知,不可能直接(仅使用管道)。即使您知道管道缓冲区的大小(您可以通过调用fpathconf(pipefds[0],_PC_PIPE_BUF)) 获得)并且您知道它是空的,仍然无法保证其他进程实际上正在从中读取。即使它正在读取,它也可以在非阻塞模式下进行。您可能会尝试找出其他进程是否在某些系统调用(例如读取)时被阻塞,但即使这样也无济于事(其他进程目前可能正在读取其他内容)。

我想到的唯一方法是使用进程信号量。这要求其他(例如子)进程确切地知道要使用哪个信号量以及如何使用它。您可以测试 samaphore 是否被锁定。

【讨论】:

以上是关于管道编写器可以判断阅读器何时阻塞吗?的主要内容,如果未能解决你的问题,请参考以下文章

Linux:打开命名管道进行写入时超时

检测阅读器何时关闭命名管道(FIFO)

Linux 上的管道读取是原子的吗(多个写入器,一个读取器)?

从命名管道读取不会给出任何输出并无限期地阻塞代码

ifstream 管道和多个(顺序)编写器

如何避免命名管道中的多个作者?