[英]Close XLib application from another process
我有一个基于Xlib的程序,其中包含一个使用XNextEvent
接收和处理相关事件的事件循环。
我希望能够从另一个进程(实际上来自shell脚本)优雅地关闭该程序。 关闭时我需要做一些清理,所以我考虑设置信号处理程序(例如SIGUSR1),当收到此信号时,进行适当的清理。
我的问题是,如何从信号处理程序中断(阻塞) XNextEvent
调用?
还有其他建议吗?
基本上,您可以使用ConnectionNumber()
宏来获取XNextEvent()
正在读取的fd。 这让我自己调用select()
来等待Xlib fd 和其他一些fd上的数据。 现在它是阻塞的select()
,而不是XNextEvent()
。 通过写入第二个fd,我可以轻松地从信号处理程序中取消阻止select()
。
事件循环的伪代码:
/* Get X11 fd */
x11_fd = ConnectionNumber(display);
while(1) {
/* Create a File Description Set containing x11_fd and other_fd */
FD_ZERO(&in_fds);
FD_SET(x11_fd, &in_fds);
FD_SET(other_fd, &in_fds);
/* Wait for X Event or exit signal */
ret = select(nfds, &in_fds, ...);
if (FD_ISSET(other_fd, &in_fds) {
/* Do any cleanup and exit */
} else {
while (XEventsQueued(display, QueuedAlready) > 0) {
/* Process X events */
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.