首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建子进程时挂起GTK应用程序

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

Stack Overflow用户
提问于 2011-08-12 19:29:54
回答 2查看 720关注 0票数 0

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

我已经在我的主函数中尝试过gdk_thread_enter()/leave()。但我还是在申请挂着。

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

EN

回答 2

Stack Overflow用户

发布于 2011-08-12 19:37:53

execve不创建子进程,它用子进程替换当前进程。您确定您首先使用了fork(),然后使用了子程序中的execve()吗?

由于您已经在使用/execve,所以编辑,也许子进程仍然在以某种方式与Gtk交互。最好使用Glib/Gtk+-特定于调用爬虫的函数-尝试,例如,异步

票数 1
EN

Stack Overflow用户

发布于 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()并不是一个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7045366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档