非阻塞读取 files/getting 文件描述符 C++

Non blocking read on files/getting file descriptors c++

我正在创建一个从不同来源(命名管道和 USB 串行设备)获取信息的程序。我可以用一个简单的 ifstream 成功地做到这一点。但现在我需要更改它以便读取是非阻塞的,因为数据是稀疏的并且源提供数据的顺序是不可预测的。 位置源在启动时是未知的,但会很快找到并且之后不会更改。我使用 g++ 编译,目标是 raspberry pi 2 (with raspbian)

经过一些研究,我遇到了 select() 和 poll()。问题是他们使用文件描述符。我在获取文件描述符方面发现很少。 我发现 (fstream.rdbuf())->fd() 但它无法编译(显然它不再受支持)

我能想到的一个可能的解决方案是将程序分成两部分: 一个搜索文件,然后使用 bash 启动程序 2,并将正确的文件通过管道传输到其中。 (例如,程序 2 <1 输入 1 <2 输入 2 ...)。至少我认为这会起作用(我知道你可以重定向多个输出,所以我认为你可以重定向多个输入) 但这似乎是一个非常糟糕的解决方案(我还需要一种方法来读取文件描述符(在 ifstream 中获取))

我能想到的另一个解决方案是多线程。每个输入都有自己的线程,然后读取块是否无关紧要。当线程接收到输入时,它需要唤醒主线程并传输数据。 这个解决方案似乎比前一个好得多,但它仍然显得笨拙(这是正确的术语吗?)。我认为这对于以前从未在 C++ 中使用过多线程的人来说太复杂了,这可能会导致数小时的调试来解决由多个线程同时发送数据引起的问题(除非 C++ 多线程更简单,然后我认为它是)。

那么还有什么其他方法可以解决这个问题(或者如果没有其他方法,推荐我的2种解决方案中的哪一种)。


英语不是我的母语,如有错误,敬请谅解。 这也是我在 Whosebug 上的第一个 post。 如果你想知道我对c++的熟悉程度。我上个学期才在我的大学里学习 c++(尽管这是一个个人项目)。并且只写了一个项目,大约有 25 类(这是一个小组项目,还有另外 3 个人)。但是我们学得很快,因为我们可以应用很多其他编程语言的知识。

C++ 流不公开底层文件描述符(因为文件描述符是 OS 特定的,而流是通用的)。

您可以使用原始描述符并在其上编写您自己的流(一点也不难)。但是,您意识到 async-io 模型需要一定的技巧吗?您提到您是多线程的新手,您曾经使用过异步 io 吗?

Boost.Asio是一个以跨平台方式处理异步IO的Boost库。它 wraps linux epoll 和 windows IO 完成端口 以 C++ 方式。

Casablanca 是 Microsoft 面向后端开发的跨平台平台。他们走得更远,用 psuedo 非阻塞 fstream 对象包裹了 Boost.Asio。它通过将工作拆分为异步任务来工作。

考虑到目前没有更好的解决方案,我会选择卡萨布兰卡。 另外,我会确保流中没有任何异常 locale 这通常会降低阅读性能。

ps。多线程解决方案在 fstream 性能方面听起来很欠缺。