XWindow应用程序中的fork()/ exec()

时间:2014-02-18 05:43:15

标签: fork x11

如何从XWindow程序执行xterm,将其插入我的窗口,但是在xterm处于活动状态和关闭后继续执行?

在我的XWindows(XLib over XCB)应用程序中,我想执行xterm -Into <handle>。所以我的窗口中包含xterm窗口。不幸的是,发生了一些错误。

伪代码:

if (fork() == 0) {
    pipe = popen('xterm -Into ' + handle);
    while (feof(pipe)) gets(pipe);
    exit(0);
}

我也累了system()execvp()。在我从bash中运行的xterm退出之前,一切都很好,然后我的程序退出。我猜这个与X服务器的连接丢失了,因为它在父和子之间共享。

更新:这是程序退出(或者说崩溃)后在终端上显示的内容。

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
   after 59 requests (59 known processed) with 1 events remaining.
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
y: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
Aborted

1 个答案:

答案 0 :(得分:2)

一种可能性是由于SIGCHLD信号没有终止 被忽略并导致程序中止。

    signal(SIGCHLD, SIG_IGN);

另一个是,因为你怀疑正在关闭X会话的东西。只是 关闭套接字本身无关紧要,但你使用的是库 注册一个可能导致问题的atexit调用。

从您的代码段开始, 看起来你并不真正关心xterm的标准,a 更好的方法是实现接近fd的0,1,2。也是因为它看起来 就像你在xterm之后不需要在子进程中做任何事情一样 终止你可以使用&#39; exec&#39;而不是&#39; popen&#39;完全取代 子进程与xterm的进程,包括任何清理处理程序 被遗弃了。虽然,我不确定你的代码片段是如何修剪你想要做的,因为很明显,对“&#39;不是你想要的。

要确保X连接已关闭,可以在exec标志上设置其关闭 以下内容。 (这将适用于x连接的POSIX系统 number是服务器套接字的fd)

 fcntl(XConnectionNumber(display), F_SETFD, fcntl(XConnectionNumber(display), F_GETFD) | FD_CLOEXEC);

另请注意&#39; popen&#39;除了你的fork之外,它本身在后台分叉,我想你可能想在那里做一个execvp然后使用waitpid(...,WNOHANG)来检查你的主X11循环中的孩子终止如果你想知道什么时候退出