[英]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.