簡體   English   中英

從另一個進程關閉XLib應用程序

[英]Close XLib application from another process

我有一個基於Xlib的程序,其中包含一個使用XNextEvent接收和處理相關事件的事件循環。

我希望能夠從另一個進程(實際上來自shell腳本)優雅地關閉該程序。 關閉時我需要做一些清理,所以我考慮設置信號處理程序(例如SIGUSR1),當收到此信號時,進行適當的清理。

我的問題是,如何從信號處理程序中斷(阻塞) XNextEvent調用?

還有其他建議嗎?

我找到了一種基於這個SO問題這個 問題的方法

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

假設您有進程ID,可以使用kill函數:

int kill(pid_t pid, int sig);

您可以發送任何信號,但SIGKILLSIGKILL無法處理)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM