【问题标题】:How can I monitor a FIFO for read and writes?如何监控 FIFO 的读写?
【发布时间】:2012-08-10 00:35:41
【问题描述】:

应该如何监控通过 FIFO 的数据?直接打开看是不行的,因为如果监视器读取所有字节,实际需要数据的程序将无法接收到数据。

【问题讨论】:

  • 你可以扮演中间人,从一个管道读取,写入另一个管道。
  • 或者您可以为 fifo 类编写一个包装器来监控它收到的所有内容
  • 你必须修改内核。告诉我们您想要达到的目标,可能有更好的方法。

标签: c++ c linux fifo


【解决方案1】:

我不确定你有什么样的 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()

【讨论】:

    【解决方案2】:

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

    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 更安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2011-03-05
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多