从C中的命名管道读取至少n个字节

时间:2018-04-04 23:29:17

标签: c macos named-pipes fread

我有一个在macos上运行的多线程(pthread)C应用程序,我试图从具有极低延迟的命名管道读取。有很多数据写入管道(每秒数十MB),而macos只有几十KB的管道缓冲区,因此保持管道清洁非常重要。

但是,我不能让整个核心忙于重复read()操作,因为我想将该CPU用于其他操作。

我已尝试在poll()上等待对命名管道进行写入,然后仅在read()事件上等待POLLIN。这是有效的,因为我从每秒运行数百万次的循环下降到每秒一百万次。然而,它仍然是一个巨大的浪费,因为每个read()操作只从管道中卸载平均10-20个字节。

我可以usleep()之间的阅读,但我不喜欢这个想法(我尝试过,我不知道怎么能让它无法正常工作)。

我相信fread()实现了一个缓冲区(你可以要求它阻止并且只在至少准备好复制n个字节时才返回),但不知怎的,我只能让它工作(等待) (对于a)少量字节,比如4个字节,而不是16或128。

0 个答案:

没有答案