【问题标题】:GTK application hangs when created a child processGTK 应用程序在创建子进程时挂起
【发布时间】:2011-10-26 02:22:54
【问题描述】:

我正在用 C 语言创建一个 GTK 应用程序。我正在使用 fork 创建一个子进程,然后将其替换为 execve("crawler",arg,env);它抓取我的主目录并将所有文件名存储在一个文件中。 现在,这个子进程需要一些时间(大约 2-5 分钟)。 同时,当这个子进程运行时,主 GTK 父程序正在等待。 但是当子进程运行时,一段时间后,GTK 应用程序挂起。

我已经在我的主函数中尝试了 gdk_thread_enter()/leave()。 但我仍然是应用程序挂起。

如有错误,请指出错误或建议任何修改。

【问题讨论】:

    标签: c gtk


    【解决方案1】:

    execve 不创建子进程,它用子进程替换当前进程。你确定你先用了 fork(),然后在子进程中用了 execve() 吗?

    EDIT 因为您已经在使用 fork/execve,所以子进程可能仍在以某种方式与 Gtk 交互。最好使用 Glib/Gtk+ 特定的函数来调用爬虫——例如,尝试g_spawn_command_line_async

    【讨论】:

    • 是的,我使用了 fork(),然后创建了一个子进程,然后使用 execve() 替换了它。抱歉,没有正确解释。编辑问题以避免进一步混淆。
    【解决方案2】:

    如果你的意思是“当这个子进程运行时,主 GTK 父程序正在等待” 是你的代码在它的主线程,那么应用程序确实会暂停执行,直到子线程终止(除非您选择了 NOHANG 选项)。

    如果您的 Gtk 应用不需要与您的爬虫程序进一步协调,只需使用前面提到的 g_spawn_command_line_async 例程,并且不要设置 G_SPAWN_DO_NOT_REAP_CHILD。如果您确实需要协调,您可以设置该标志,并创建一个GChildWatch source,或者可以使用其中一个 g_spawn 管道例程。

    正如我对gdk_thread_enter()/leave() 的解释,它们正在锁定或解锁线程,而不是运行或停止新线程。 Gtk 回调在主线程中运行,因此如上所述,回调中的阻塞 waitpid() 将挂起 Gtk 应用程序。但是,计时器回调(例如)中的非阻塞 waitpid() 不是问题。

    【讨论】:

    • 我的意思是挂起,它冻结(变黑)。无论如何,我会尝试 g_spawn_command_line_async 并让您知道它是否解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多