如何监控FIFO的读写?

时间:2012-08-10 00:35:42

标签: c++ c linux fifo

如何监控通过FIFO的数据?简单地打开并继续观察不起作用,因为如果监视器读取所有字节,则需要数据的实际程序将无法接收数据。

2 个答案:

答案 0 :(得分:0)

我不确定你在那里有什么样的FIFO(管道?套接字?也许你应该在一般情况下详细说明你的问题),但我知道正向阅读的唯一情况是使用套接字。

您可以将recv()与标记MSG_PEEK一起使用,效果如下:

  

此标志使接收操作从中返回数据                 接收队列的开始而不从中删除该数据                 队列。因此,后续的接收调用将返回相同的数据。

您也可以使用套接字实现IPC(unix(7)),因此您可能希望将它们添加到项目中(如果您使用的是linux / unix)。如果您想知道如何使用套接字,那么您应该阅读手册页:socket(2)socket(7),或者对于Windows,recv()socket()

您可能还想尝试使用2个FIFO,一个用于显示器,另一个用于显示器到实际程序。然后,您只需使用显示器读取所有传入数据,并过滤相关部件并将其直接写入实际程序。如果您的实际程序中有多个接收器并且想要分割传入的数据,这可能会派上用场。

如果您只是想知道是否有要阅读的数据,可以使用select(2) or pselect(2)poll(2)select()

答案 1 :(得分:0)

您应该使用以下系统调用之一:

select() - source:man -s 2 select

pselect() - 来源:man -s 2 pselect

  

select()和pselect()允许程序监视多个   文件          描述符,等待一个或多个文件描述符变为          “准备好”用于某类I / O操作(例如,输入可能)。一份文件          如果可以执行相关,则认为描述符已准备就绪          支持I / O操作(例如,读取(2))而不会阻塞。

注意它们都是I / O阻塞调用。

ppoll() - man -s 2 ppoll

poll() - man -s 2民意调查

同时阅读两组系统调用之间的区别:http://www.unixguide.net/network/socketfaq/2.14.shtml

使用pselect或ppoll总是比select和poll更好用于更安全的用途。