据我所知,C 中的
select()
函数只能等待文件描述符变为活动状态(即读取它们而不阻塞。)
这对于命令行消息应用程序很有用,因为所有内容都可以是套接字文件描述符或标准输入。
但是,如果我想将其与 GUI 应用程序合并(例如,用 Gtk 编写的应用程序?)
我认为没有办法告诉
select()
等待按钮被按下,对吗?那么我必须使用多线程吗?
如果您想将非 fd 活动合并到基于
select
的事件循环(或其他与 fd 相关的替代方案,如 epoll
)中,您可以使用管道来实现。事件触发的动作(例如按下按钮)会将事件的描述写入管道,并且select
掩码包含管道的读取端,因此会通知数据可用性。
如果事件和处理程序位于同一进程中,则无需完全序列化事件描述,因为可以使用其他一些机制(内存中的事件队列或类似机制)。然而,由于大多数事件都可以用几个字节轻松有效地描述,因此序列化事件提供了一种易于扩展的架构。