2011-08-12 50 views
0

我使用fork創建了一個子進程,然後用execve(「crawler」,arg,env)替換它。它抓取我的主目錄並將所有文件名存儲在一個文件中。 現在,這個子進程需要一些時間(大約2-5分鐘)。 與此同時,當這個子進程正在運行時,主GTK父程序正在等待。 但是,當子進程正在運行,一段時間後,GTK應用程序掛起。創建子進程時GTK應用程序掛起

我在我的主函數中嘗試過gdk_thread_enter()/ leave()。 但我仍然是應用程序掛。

請指出一個錯誤,如果有的話或提出任何修改。

回答

1

execve不會創建子進程,它將用當前進程替換子進程。你確定你先使用了fork(),然後使用了child中的execve()嗎?

編輯由於您已經使用fork/execve,可能子進程仍然以某種方式與Gtk進行交互。最好用油嘴/ GTK +特異功能調用履帶 - 嘗試,例如,g_spawn_command_line_async

+0

是的,我已經使用fork(),然後創建一個子進程,然後使用execve()替換它。對不起,沒有正確解釋。編輯該問題以避免進一步混淆。 – Prashant

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()不是問題。

+0

按照我的意思,它會凍結(變黑)。無論如何,我會嘗試g_spawn_command_line_async並讓你知道它是否解決了這個問題。 – Prashant