【问题标题】:Group multiple file descriptors to one "virtual" file descriptor for exporting an FD over an API将多个文件描述符分组为一个“虚拟”文件描述符,以通过 API 导出 FD
【发布时间】:2019-11-08 20:04:55
【问题描述】:

如果子系统具有事件处理能力,那么在 Unix/Linux 世界中通常会向该子系统添加 API 调用以允许公开文件描述符,以便可以将所述事件处理集成到使用某些东西的现有主循环中比如 poll() 或 select()。例如,在 Wayland 中,有 wl_display_get_fd()。如果该 FD 显示活动,则可以调用 wl_display_read_events() 和朋友。

如果该子系统内部只有一个 FD,这将很简单。但是如果有多个 FD 需要监视事件怎么办?

我只看到两个解决方案:

  1. 公开所有 FD。但是,我不知道有任何 API 可以做到这一点。
  2. 公开某种“虚拟”FD,它以某种方式与内部“真实”FD 耦合。一旦真正的 FD 接收到数据并被标记为可读,那么虚拟 FD 也是如此。一旦可以写入真实的 FD,虚拟 FD 就会自动标记为可写等。

#2 对我来说听起来更干净。有可能这样做吗?还是有更好的方法来解决这个问题?

【问题讨论】:

    标签: linux unix event-handling file-descriptor


    【解决方案1】:

    如果您专门使用 Linux,那么您可以使用epoll 机制。您首先使用

    创建一个epoll 实例
    int fd;
    
    fd = epoll_create(1); // The argument is legacy and doesn't matter.  It just has to be positive.
    

    之后,您可以添加您关心的选择器。

    if ( epoll_ctl(fd, EPOLL_CTL_ADD, some_file_descriptor, NULL) != 0 ) {
        // handle error
    }
    

    最后一个参数实际上可以包含希望稍后在您的文件描述符之一准备好时传回给您的数据。查看手册页了解详情。

    您可以使用epoll_waitepoll_pwait 查询任何可用的描述符。

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 2017-07-11
      • 2021-08-08
      相关资源
      最近更新 更多