2012-08-13 100 views
2

我收到了一個Unix工具,我想在Windows下運行/編譯。看完之後,我發現它使用了forkexecv等等。我現在想了解它的功能以及如何在Windows中實現這一點。Windows,fork和execv

該代碼不僅僅是要求在這裏,所以請不要評論這段代碼是否合理。

pid = fork(); 
if(pid==0){ 
    execv("/usr/bin/java",args); 
} 

如果我解釋這個正確的,這其中不僅會像調用javaargs陣列中提供的參數。所以在Windows中,這可以很容易地通過像system()CreateProcess(我沒有閱讀如何做到這一點,只是知道它可以做到)。

但這裏是我的問題:如果我理解正確的驗證碼叉,並呼籲execv因爲execv不返回,沒有第一分叉是我的程序將無法完成。它是否正確?

回答

3

execv不返回,我的程序不會 完成,而不是先分叉。它是否正確?

其實你的程序會自己變成exec'd程序。即執行後,新程序將開始執行,但過程將是相同的:相同的PID,相同的少數繼承屬性等。

+0

有任何相關信息可以被定義,如果我剛剛創建了一個那就沒辦法了處理?可能java需要繼承我的進程中需要工作的任何東西(僅供參考:工具也使用unix管道,但可能完全不相關)? – javex 2012-08-13 15:11:13

+0

@javex我不確定你在問什麼。無論您是否分叉,新創建的流程都會繼承東西。 – cnicutar 2012-08-13 15:12:41

+0

好吧謝謝 - 我會自己找出其餘的,謝謝你的幫助 – javex 2012-08-15 08:01:43

3

Fork創建子進程,其PID與父PID不同。在你的代碼中,你調用fork來運行另一個進程而不關閉當前(父進程)進程。

在調用fork並轉到子進程後,我們調用execv(); execv()函數用一個新的過程映像替換當前的過程映像,它將通過傳遞的參數執行java程序。

父進程必須等待子進程來完成,這樣子進程將不會成爲殭屍進程(子無父)

+0

謝謝,這是一個很好的補充:) – javex 2012-08-20 08:15:58