天天看點

fork() and vfork() getppid's result

fork和vfork的描述和差別參考本文最後的部分.

下面來看看用fork或vfork建立的子程序, 子程序看到的ppid(父程序是多少).

fork : 

接下來看看環境變量會不會也變掉 . 

從結果來看, 環境變量會繼承下去, 不會因為init接管而改變.

    原因是這些程序是主程序fork出來的, 還記得前幾天寫的一篇《fork and page sharing》, 本例中主程序的記憶體空間不會因為主程序退出而馬上釋放掉, 因為子程序還需要用到共享的記憶體部分.  環境變量也存儲在主程序的某些記憶體空間裡面, 具體是哪塊空間目前還不清楚 . 

    vfork()建立的子程序, 父程序号是多少呢? 我想不說也知道了, 就是建立子程序的程序的程序号. 因為vfork建立子程序, 父程序要等待子程序執行完成. 就好像預設用了waitpid.

另外要提一下, 為什麼fork()的傳回值類型是pid_t, 包括還有其他一些系統函數傳回值并不是c語言的基本類型(int, char, short, long, float,或者double). 因為在不同的作業系統中, 用來存儲程序号的資料類型可能不一樣, 如有的系統可能用short, 也有的可能用int.

如果你寫程式的時候使用short來存儲fork()的傳回值, 那麼當這個程式要在另一個作業系統用int來表述程序号的環境下編譯運作就可能出現問題.

使用pid_t很好的規避了這個問題.

【參考】

http://en.wikipedia.org/wiki/zombie_process

http://en.wikipedia.org/wiki/orphan_process

http://en.wikipedia.org/wiki/daemon_(computing)

vfork : 

getpid, getppid : 

繼續閱讀