如何检测任何通信通道上可用的数据?

问题描述

动机:

我正在编写一个应用程序来处理所有可能的通信渠道 以统一的方式,即通过终端、串行接口输入/输出, 图形用户界面 (xcb | win32),通过套接字的 Web 界面。

问题:

我需要一些机制来: a) 使我的主应用程序循环休眠或阻塞(以节省 cpu 时间); b) 一旦数据到达任何通道,就将其再次唤醒。

有什么想法吗? 谢谢。

解决方法

解决方案:

1 个阻塞调用:

  • 功能:仅在一个频道上阻止节目
  • 问题:无法检测到到达其他通道的数据
  • 示例:xcb_wait_for_event、fgetwc

2 个非阻塞调用:

  • 功能:无限循环测试/读取所有通道
  • 问题:cpu 使用率(忙等待)
  • 问题:如果循环比用户快,则不会检测到所有输入
  • 示例:xcb_poll_for_event,带有 termios 设置的 fgetwc ~ICANON; ~回声; c_cc[VMIN] = 0; c_cc[VTIME] = 0;

3 选择:

  • 功能:避免忙等待,覆盖多频道
  • 问题:只处理那些带有文件描述符的通道(不是 xcb 等)

4 libuv(来自 Node.js):

  • 功能:处理多通道,事件驱动的异步I/O模型
  • 问题:不处理图形窗口系统事件
  • 问题:强迫我使用他们的数据结构
  • 问题:依赖外部库

每个通道 5 个线程并休眠:

  • 功能:确实检测数据并可能设置一个内部标志
  • 问题:主循环需要检查flag(忙等待,cpu使用率)

每个通道 6 个线程,暂停或 sigsuspend 和系统信号唤醒:

  • 功能:类似于睡眠但避免忙等待使用系统信号唤醒
  • 问题:进程的线程也在休眠,无法检测到输入
  • 问题:如果我的程序运行多个实例,所有实例都会被唤醒