【发布时间】:2021-02-20 15:21:00
【问题描述】:
我正在设计一个在 Linux 上运行的机器人,我想从运行在 TCP/IP 上的机器人获得一个仅遥测接口,主要用于我自己关于 TCP 的教育,但也用于保证数据包排序和校验和。我目前的设计是三个线程:
- 侦听连接并向
the list添加新连接的线程 - 从系统其他部分收集遥测数据并将其发送到
the list中的每个连接的线程 - 将
select与the list关联,并删除与列表断开连接的所有客户端
我希望线程 1 能够向线程 3 发出信号“嘿伙计,新连接,更新您的列表”,对我来说显而易见的答案是创建一些可以添加到 @ 的额外文件/管道987654327@ 的select 列表,如果附加文件是通知更新列表的文件。我认为文件或管道对于信号来说有点矫枉过正,我应该认为二进制信号量可以解决问题,但我不知道如何在二进制信号量上select。
我想我的问题是:你认为什么可以变成文件描述符以便你可以选择它们?
我的第二个问题是:我是一名“老派”的 Linux/C 开发人员,试图跟上更现代的技术,特别是现代 c++,是否有更“现代的 c++”方法来做到这一点?
【问题讨论】:
-
我认为管道或套接字是您想要用于向 select() 发送信号的东西。
-
Linux 为此提供了
eventfd()。你的线程 2 和 3 应该是一个线程。线程 1 可能也可以合并到其中。 -
现代 C++ 会使用 asio 之类的。
-
你应该合并线程 1 和 3。没有理由将它们分开。
标签: linux multithreading sockets embedded-linux