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

时间:2014-01-30 11:54:15

标签: c linux signals x11 xlib

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

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

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

还有其他建议吗?

2 个答案:

答案 0 :(得分:6)

我找到了一种基于this SO questionthis 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 */
        }
    }
}

答案 1 :(得分:0)

假设您有进程ID,可以使用kill函数:

int kill(pid_t pid, int sig);

您可以发送任何信号,但SIGKILLSIGKILL无法处理)