gpt4 book ai didi

c++ - 非阻塞读取文件/获取文件描述符c++

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:15 27 4
gpt4 key购买 nike

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

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

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

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

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


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

最佳答案

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

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

关于c++ - 非阻塞读取文件/获取文件描述符c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35660017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com