gpt4 book ai didi

从另一个进程关闭 XLib 应用程序

转载 作者:可可西里 更新时间:2023-11-01 11:46:17 25 4
gpt4 key购买 nike

我有一个基于 Xlib 的程序,它有一个事件循环,它使用 XNextEvent 来接收和处理相关事件。

我希望能够从另一个进程(实际上是从 shell 脚本)优雅地关闭这个程序。关闭时我需要做一些清理,所以我考虑设置一个信号处理程序(例如 SIGUSR1),当收到这个信号时,进行适当的清理。

我的问题是,如何中断来自信号处理程序的(阻塞的)XNextEvent 调用?

还有什么建议吗?

最佳答案

我找到了一种基于 this SO question 的方法和 this one .

基本上,您可以使用 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 */
}
}
}

关于从另一个进程关闭 XLib 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21455824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com