首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞读取文件/获取文件描述符c++

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

Stack Overflow用户
提问于 2016-02-26 19:23:44
回答 2查看 1.4K关注 0票数 0

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

经过一些研究,我发现了select()和After ()。问题是他们使用文件描述符。我在获取文件描述符方面几乎没有发现。我找到了(fstream.rdbuf())->fd(),但它没有编译(显然不再支持)

我可以想到的一个可能的解决方案是将程序分成两个部分:一个部分搜索文件,然后使用bash启动程序2,并将正确的文件插入其中。(如program2 <1 input1 <2输入2.)至少我认为这是可行的(我知道您可以重定向多个输出,因此我假设您可以重定向多个输入),但这似乎是一个非常糟糕的解决方案(而且我还需要一种方法来从文件描述符中读取(在ifstream中获得))。

我能想到的另一个解决方案是多线程。每个输入都有自己的线程,那么读取块是否重要并不重要。当线程接收到输入时,它需要唤醒主线程并传输数据。这个解决方案似乎比前一个好得多,但它仍然很难处理(这是正确的术语吗?)我认为对于那些以前从未在c++中多线程过的人来说,这太复杂了,而且这可能会导致数小时的调试来修复问题(如多个线程同时发送数据所引起的问题)(除非c++多线程非常简单,我认为是这样)。

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

英语不是我的母语,对任何错误都很抱歉。这也是我关于堆栈溢出的第一篇文章。如果你想知道我对c++有多熟悉。上学期我才在大学里学到c++ (虽然这是个个人项目)。并且只写了一个有25个课程的项目(这是一个小组项目,还有3个人)。但是我们学得很快,因为我们可以从其他编程语言中应用很多知识。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-26 19:30:21

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-02-26 19:32:06

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

卡萨布兰卡是微软面向后端开发的跨平台平台。他们更进一步,用psuedo非阻塞的Boost.Asio对象包装fstream。它通过将工作分解为异步任务来工作。

考虑到目前没有更好的解决办法,我会去卡萨布兰卡。另外,我要确保流没有任何异常的locale,这通常确实会降低阅读性能。

ps。就fstream性能而言,多线程解决方案听起来很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35660017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档