我认为这个问题并不新鲜:我有一个线程应该从X服务器(通过XCB)和另一个通过TCP连接的服务器读取,因此需要调用select。
令我困惑的是,当程序从 select 返回时,发现 X server 链接中有数据,如果数据不足以用于 XCB 事件怎么办?这种情况下xcb_poll_for_event()应该返回NULL,但是当程序再次调用select时它并不会阻塞,因为毕竟还有一些数据,所以程序陷入了“忙”等待状态。
这是一个合理的担忧吗?我相信是这样,因为每个 XCB 事件都是由很多字节组成的,并且服务器在发送过程中可能会中断。
如何使用 setsockopt() 为 xcb fd 设置 SO_RCVLOWAT 以及 XCB 事件所需的大小。现在,只有当至少有一定量的数据可供读取时,套接字的文件描述符才会选择为可读。这是我们在处理 TCP 服务器时使用的正常方法,但还没有在 XCB fd 上尝试过。