ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-08-25 08:53:59  阅读:226  来源: 互联网

标签:c-3 xlib linux x11 signals


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

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

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

还有其他建议吗?

解决方法:

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

标签:c-3,xlib,linux,x11,signals
来源: https://codeday.me/bug/20190825/1717130.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有