2011-08-25 105 views
1

我有一個perl腳本調用fork()幾次創建4個子進程。父進程然後使用waitpid()等待所有的孩子完成。Perl系統()命令失敗後叉

當我嘗試從子進程內調用system()(我使用它創建目錄)時,會發生此問題。即使像系統一樣簡單(「dir」)失敗(是的,我在Windows上)。

「失敗」,我的意思是說,其中一個子線程越過它沒有問題,但其他子進程,據我所知可以簡單地停止存在。

trace INFO, "Thread $thread_id still alive at 2.62"; 
system("dir"); 
trace INFO, "Thread $thread_id still alive at 2.65"; 

我得到諸如「線程3仍然活着在2.62」的消息,但只有1個子線程達到2.65。

在日誌的底部,我可以看到「命令以非零狀態127退出」,我認爲這可能與它有關。

我考慮過使用某種互斥鎖來確保一次只有一個進程通過系統調用,但我怎麼用fork()來做到這一點?另外,這個問題首先沒有任何意義,爲什麼幾個獨立的進程在同一時間做系統(「dir」)有困難?

+1

你爲什麼使用'system()'創建目錄? – TLP

+0

您使用的是哪個版本的perl?它是線程安全的嗎? –

+0

您能否提供(最少量的)代碼來重現我們運行的問題? – ikegami

回答

2

這裏的問題是在windows下使用線程模擬fork()。所以沒有創建真正的流程。

如果你是使用系統調用創建文件夾,那麼你最好使用Perl函數mkdirFile::Pathmake_path代替。

+0

雖然每個線程都運行在它自己的CPU Core上,但這與此有關嗎? (我有一個四核CPU,運行4個線程使其達到100%,而沒有並行化的25%) – numegil

+0

線程共享內存。可能'系統'需要獨佔訪問某些內部結構(但它是共享的,因爲沒有新的*進程*創建) –

+1

@Ivan Nevostruev,我不清楚你在說什麼,但如果你說'系統'不會創建新的流程,這是錯誤的。 – ikegami