[TOC]
# 孤兒進程
******
孤兒進程指的是在其父進程執行完成或被終止后仍繼續運行的一類進程。這些孤兒進程將被 init 進程(進程號為1)所收養,并由 init 進程對它們完成狀態收集工作。
孤兒進程沒有任何危害,只是需要注意自己的代碼邏輯即可。例如:
```php
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die('fork error');
} else if ($pid > 0) {
echo "爸爸先走了,兒子你好好干活\n";
exit(0);
} else {
while(1) {
echo "1";
sleep(1);
}
}
```
運行結果:

<br />
## 孤兒進程和僵尸進程
僵尸進程:一個子進程在其父進程還沒有調用 wait() 或 waitpid() 的情況下退出。這個子進程就是僵尸進程。任何一個子進程(init 除外)在 exit() 之后,并非馬上就消失掉,而是留下一個稱為僵尸進程(Zombie)的數據結構,等待父進程處理。這是每個子進程在結束時都要經過的階段。如果子進程在 exit() 之后,父進程沒有來得及處理,那么保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統所能使用的進程號是有限的,如果大量的產生僵尸進程,將因為沒有可用的進程號而導致系統不能產生新的進程。此即為僵尸進程的危害,應當避免。
孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那么那些子進程將成為孤兒進程。孤兒進程將被 init 進程(進程號為1)所收養,并由 init 進程對它們完成狀態收集工作。孤兒進程是沒有父進程的進程,孤兒進程這個重任就落到了 init 進程身上,init 進程就好像是一個民政局,專門負責處理孤兒進程的善后工作。每當出現一個孤兒進程的時候,內核就把孤兒進程的父進程設置為 init,而 init 進程回循環地 wait() 它的已經退出的子進程。這樣,當一個孤兒進程凄涼地結束了其生命周期的時候,init 進程就會代表黨和政府出面處理它的一切善后工作。因此孤兒進程并不會有什么危害。
- 引言
- Introduction
- 運行模式
- php-fpm
- php-cli
- 基礎介紹
- 網絡協議
- ip
- tcp
- tcp
- http
- webSocket
- udp
- port端口
- 會話管理
- cookie
- session
- api/token
- linux基礎
- lnmp安裝
- 命令
- 進程管理
- 擴展安裝
- 端口監控
- 防火墻說明
- php7.0
- 部分新特性
- php回調/閉包
- 回調事件
- 閉包/匿名函數
- php多進程
- 多進程開啟
- 進程通信
- 進程信號
- 僵尸進程
- 孤兒進程
- 守護進程
- 同步/異步
- 阻塞/非阻塞
- 協程
- Swoole
- 初始Swoole
- 運行機制
- 生命周期
- composer使用
- EasySwoole
- 設計理念
- 組件說明
- 運行過程
- demo
- 提問的藝術