创建子进程时,GTK应用程序挂起

时间:2011-08-12 19:29:55

标签: c gtk

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

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

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

2 个答案:

答案 0 :(得分:1)

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

编辑,因为你已经在使用fork / execve,也许子进程仍然以某种方式与Gtk进行交互。最好使用Glib / Gtk +特定函数来调用爬虫 - 例如,尝试g_spawn_command_line_async

答案 1 :(得分:1)

如果你的意思是“当这个子进程运行时,主GTK父程序正在等待”是你的代码在其中执行wait(),waitid(),waitpid()主线程,然后应用程序将确实暂停执行,直到子进程终止(除非您选择了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()不是问题。

相关问题