如何让C程序在FIFO管道为空之前阻塞?

4
我正在使用命名(FIFO)管道进行IPC,希望协调程序只有在读取管道的程序已经将先前写入的数据从管道中读出时才能向管道写入数据。因此,我希望在管道为空时阻止写入。这是否可能?
我考虑的一个选项是,当管道已满时,写入函数会被阻塞。但是,我希望对Linux中的管道大小进行更小量级的数据操作。例如,我希望程序只能写入20个字节,然后等待另一端读取数据。我认为您无法缩小命名管道的大小到这么小(最小尺寸似乎是页面文件大小(4096字节)?)
谢谢!

2
你需要自己的双向协议,不能依赖于管道上的阻塞。 - bmargulies
是的,这是可能的,我想要相同的功能,但是针对管道大小更小的数据量。可以有多个程序,我希望一个程序只能将例如20个字节写入管道,直到它被阻塞。 - user3054408
5
这听起来有点像 XY 问题;阻塞写作是一种非常奇怪的渴望。你能否提供更多关于你实际任务的细节? - Dave
1
一个简单的方法是创建第二个管道来确认接收到的数据片段,就像bmargulies建议的那样。 - Cahu
看起来你想要Unix域套接字(在应用程序协议中指定消息边界)或Windows命名管道(它们甚至有消息模式),允许不相关进程之间进行双向通信。 - jfs
显示剩余3条评论
1个回答

0
一个可能的解决方案是,在读取过程中读取一些数据时向写入进程发送信号。你可以使用kill()来向写入进程发送SIGTERM信号,因为SIGTERM可以被捕获和处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接