应该如何监控通过 FIFO 的数据?简单地打开并继续观看是行不通的,因为如果监视器读取所有字节,则需要数据的实际程序将无法接收数据。
2 回答
我不确定你那里有什么样的 FIFO(管道?套接字?也许你应该更详细地说明你的问题),但我知道的关于前向读取的唯一情况是套接字。
您可以使用具有以下效果recv()
的标志:MSG_PEEK
此标志使接收操作从接收队列的开头返回数据,而不从队列中删除该数据。因此,后续的接收调用将返回相同的数据。
您也可以使用套接字实现 IPC(unix(7)),因此您可能希望将它们添加到您的项目中(如果您使用的是 linux/unix)。如果您想知道如何使用套接字,那么您应该阅读手册页:socket(2)和socket(7),或者在 Windows 的情况下,recv()
and socket()
.
您可能还想尝试使用 2 个 FIFO,一个到您的监视器,另一个从您的监视器到您的实际程序。然后,您只需使用监视器读取所有传入数据并过滤相关部分并将它们直接写入您的实际程序。如果您的实际程序中有多个接收器并且想要拆分传入的数据,这可能会派上用场。
如果您只是想知道是否有数据要读取,您可以使用select(2) 或 pselect(2)或者poll(2),或者select()
您应该使用以下系统调用之一:
select()- 来源:man -s 2 select
pselect()- 来源:man -s 2 pselect
select() 和 pselect() 允许程序监视多个文件描述符,等待一个或多个文件描述符“准备好”用于某种类型的 I/O 操作(例如,可能的输入)。如果可以在没有阻塞的情况下执行相应的 I/O 操作(例如 read(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 更安全。