主循环中的多个事件源没有 100% cpu 使用率

Multiple event sources in a main loop without 100% cpu usage

我用 C 写了一个程序,它有一个主循环,看起来像这样:

   while (running) {

     int recv = read_line(fd1, buf, sizeof(buf));
     if (recv > -1) {
       processCommand(buf);
     }
 
     while (XPending(display)) {
       XNextEvent(display, &ev); // This is blocking
       // Handle event
     }
   }

您可以看到我们有 2 个事件源,其中一个是阻塞的。

这很好用,但这意味着我有 100% CPU 使用率。通常在这样的程序中,阻塞调用会解决这个问题,但因为我有两件事要检查,所以我不能让循环被阻塞。

正确的编程方式是什么:

在 C 中实现具有多个源的事件循环的最佳方法是使用 selectpoll

select() 允许您等待多个文件描述符上的事件或超时。

看看man page

如前所述,'select'或'poll'是您的朋友。要获取显示器的文件描述符:

连接数(显示)

int XConnectionNumber(Display *display);

两者都return指定显示器的连接数。在符合 POSIX 的系统上,这是连接的文件描述符。