如何监控通过FIFO的数据?简单地打开并继续观察不起作用,因为如果监视器读取所有字节,则需要数据的实际程序将无法接收数据。
答案 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更好用于更安全的用途。