我在C中创建了一个GTK应用程序,我使用叉创建了一个子进程,然后用execve替换它(“爬行器”,arg,env);它爬行我的主目录,并将所有文件名存储在一个文件中。现在,这个子进程需要一些时间(大约2-5分钟)。同时,当该子进程运行时,主GTK父程序正在等待。但是,当子进程运行时,一段时间后,GTK应用程序将挂起。
我已经在我的主函数中尝试过gdk_thread_enter()/leave()。但我还是在申请挂着。
请指出一个错误,如果有或建议任何修改。
发布于 2011-08-12 19:37:53
execve不创建子进程,它用子进程替换当前进程。您确定您首先使用了fork(),然后使用了子程序中的execve()吗?
由于您已经在使用/execve,所以编辑,也许子进程仍然在以某种方式与Gtk交互。最好使用Glib/Gtk+-特定于调用爬虫的函数-尝试,例如,异步
发布于 2011-08-13 05:37:37
如果您所说的“运行此子进程时,主要的GTK父程序正在等待”的意思是,您的代码在其主线程中执行wait()、waitid()、waitpid(),那么该应用程序实际上将暂停执行,直到一个子进程终止为止(除非您选择了NOHANG选项)。
如果您的Gtk应用程序不需要与您的爬虫程序进一步协调,只需使用前面提到的异步例程,并且不要设置G_SPAWN_DO_NOT_REAP_CHILD。如果确实需要协调,可以设置该标志并创建一个GChildWatch源,或者可以使用g_spawn管道例程之一。
在我解释输入()/leave()时,它们是锁定或解锁线程,而不是运行或停止新线程。Gtk回调在主线程中运行,因此,如上所述,回调中的阻塞等待will ()将挂起Gtk应用程序。然而,在计时器回调(例如)中,一个非阻塞的等待non()并不是一个问题。
https://stackoverflow.com/questions/7045366
复制相似问题