管道编写器可以判断阅读器何时阻塞吗?
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 是否被锁定。
【讨论】:
以上是关于管道编写器可以判断阅读器何时阻塞吗?的主要内容,如果未能解决你的问题,请参考以下文章