-
os.getpid() 返回進程pid
-
os.getppid() 返回父進程pid
子進程返回0,父進程中返回子進程的pid.
————————————————————————————————————————————————————————
殭屍進程:
若子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程佔用的資源,此時子進程將成爲一個殭屍進程。
有什麼壞處? 如果大量的產生殭屍進程,將因爲沒有可用的進程號而導致系統不能產生新的進程. 此即爲殭屍進程的危害,應當避免。
殭屍進程的避免:
- 父進程通過os.wait()和os.waitpid()等函數等待子進程結束,這會導致父進程掛起。
- 如果父進程很忙,那麼可以用signal函數爲SIGCHLD安裝handler,因爲子進程結束後, 父進程會收到該信號,可以在handler中調用wait回收。
- 如果父進程不關心子進程什麼時候結束,那麼可以用signal(SIGCHLD,SIG_IGN) 通知內核,自己對子進程的結束不感興趣,那麼子進程結束後,內核會回收, 並不再給父進程發送信號。
- 還有一些技巧,就是fork兩次,父進程fork一個子進程,然後繼續工作,子進程fork一 個孫進程後退出,那麼孫進程被init接管,孫進程結束後,init會回收。不過子進程的回收 還要自己做。
子進程變成殭屍進程,是因爲父進程先執行完,沒有等待子進程結束。而wait()並不是用來等待子進程結束的,只是防止父進程先於子進程退出;如果父進程先退出,會使子進程成爲殭屍進程,這時候子進程結束的時候就由1號init進程來回收。
主進程通過調用os.wait()等待子進程結束。