将 select() 与非基于文件描述符的输入结合使用

问题描述 投票:0回答:1

据我所知,C 中的

select()
函数只能等待文件描述符变为活动状态(即读取它们而不阻塞。)

这对于命令行消息应用程序很有用,因为所有内容都可以是套接字文件描述符或标准输入。

但是,如果我想将其与 GUI 应用程序合并(例如,用 Gtk 编写的应用程序?)

我认为没有办法告诉

select()
等待按钮被按下,对吗?那么我必须使用多线程吗?

c++ c posix-select
1个回答
2
投票

如果您想将非 fd 活动合并到基于

select
的事件循环(或其他与 fd 相关的替代方案,如
epoll
)中,您可以使用管道来实现。事件触发的动作(例如按下按钮)会将事件的描述写入管道,并且
select
掩码包含管道的读取端,因此会通知数据可用性。

如果事件和处理程序位于同一进程中,则无需完全序列化事件描述,因为可以使用其他一些机制(内存中的事件队列或类似机制)。然而,由于大多数事件都可以用几个字节轻松有效地描述,因此序列化事件提供了一种易于扩展的架构。

© www.soinside.com 2019 - 2024. All rights reserved.