摘要:簡介來源官方等待或返回的子進程狀態函數刮起當前進程的執行直到一個子進程退出或接收到一個信號要求中斷當前進程或調用一個信號處理函數。子進程使用的所有系統資源將被釋放。子進程已經退出并且其狀態未報告時返回。
pcntl_wait 簡介
# 來源官方 pcntl_wait — 等待或返回fork的子進程狀態 int pcntl_wait ( int &$status [, int $options = 0 ] ) wait函數刮起當前進程的執行直到一個子進程退出或接收到一個信號要求中斷當前進程或調用一個信號處理函數。 如果一個子進程在調用此函數時已經退出(俗稱僵尸進程),此函數立刻返回。子進程使用的所有系統資源將 被釋放。關于wait在您系統上工作的詳細規范請查看您系統的wait(2)手冊。 Note: 這個函數等同于以-1作為參數pid 的值并且沒有options參數來調用pcntl_waitpid() 函數。 參數 status pcntl_wait()將會存儲狀態信息到status 參數上,這個通過status參數返回的狀態信息可以用以下函數 pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig()以及 pcntl_wstopsig()獲取其具體的值。 options 如果您的操作系統(多數BSD類系統)允許使用wait3,您可以提供可選的options 參數。如果這個參數沒有提供,wait將會被用作系統調用。如果wait3不可用,提供參數 options不會有任何效果。options的值可以是0 或者以下兩個常量或兩個常量“或運算”結果(即兩個常量代表意義都有效)。 options可用值 WNOHANG 如果沒有子進程退出立刻返回。 WUNTRACED 子進程已經退出并且其狀態未報告時返回。 返回值 pcntl_wait()返回退出的子進程進程號,發生錯誤時返回-1,如果提供了 WNOHANG作為option(wait3可用的系統)并且沒有可用子進程時返回0。測試代碼
0, 如果fork成功,返回子進程id // 父進程邏輯 pcntl_wait($status); // 父進程必須等待一個子進程退出后,再創建下一個子進程。 $child_id = $pid; //子進程的ID $pid = posix_getpid(); //獲取當前進程Id $ppid = posix_getppid(); // 進程的父級ID $time = microtime(true); echo "我是父進程,fork的子進程id: {$child_id};當前進程id:{$pid};父進程id:{$ppid}; 當前index:{$index}; 當前時間:{$time}".PHP_EOL; } else { // $pid = 0 // 子進程邏輯 $cid = $pid; $pid = posix_getpid(); $ppid = posix_getppid(); $myid = getmypid(); $time = microtime(true); echo "我是子進程,當前進程id:{$pid};父進程id:{$ppid}; 當前index:{$index}; 當前時間:{$time}".PHP_EOL; //exit; //sleep(2); } $index++; }loop = 1 執行結果
當前進程:16604 我是子進程,當前進程id:16605;父進程id:16604; 當前index:0; 當前時間:1528696774.1978 我是父進程,fork的子進程id: 16605;當前進程id:16604;父進程id:15128; 當前index:0; 當前時間:1528696774.2032loop = 2 執行結果
當前進程:16613 我是子進程,當前進程id:16614;父進程id:16613; 當前index:0; 當前時間:1528696781.4751 當前進程:16614 我是子進程,當前進程id:16615;父進程id:16614; 當前index:1; 當前時間:1528696781.4756 我是父進程,fork的子進程id: 16615;當前進程id:16614;父進程id:16613; 當前index:1; 當前時間:1528696781.4802 我是父進程,fork的子進程id: 16614;當前進程id:16613;父進程id:15128; 當前index:0; 當前時間:1528696781.4858 當前進程:16613 我是子進程,當前進程id:16616;父進程id:16613; 當前index:1; 當前時間:1528696781.4863 我是父進程,fork的子進程id: 16616;當前進程id:16613;父進程id:15128; 當前index:1; 當前時間:1528696781.4913loop = 3 執行結果
當前進程:16625 我是子進程,當前進程id:16626;父進程id:16625; 當前index:0; 當前時間:1528696787.3334 當前進程:16626 我是子進程,當前進程id:16627;父進程id:16626; 當前index:1; 當前時間:1528696787.3338 當前進程:16627 我是子進程,當前進程id:16628;父進程id:16627; 當前index:2; 當前時間:1528696787.3345 我是父進程,fork的子進程id: 16628;當前進程id:16627;父進程id:16626; 當前index:2; 當前時間:1528696787.3391 我是父進程,fork的子進程id: 16627;當前進程id:16626;父進程id:16625; 當前index:1; 當前時間:1528696787.3434 當前進程:16626 我是子進程,當前進程id:16629;父進程id:16626; 當前index:2; 當前時間:1528696787.3441 我是父進程,fork的子進程id: 16629;當前進程id:16626;父進程id:16625; 當前index:2; 當前時間:1528696787.3496 我是父進程,fork的子進程id: 16626;當前進程id:16625;父進程id:15128; 當前index:0; 當前時間:1528696787.3543 當前進程:16625 我是子進程,當前進程id:16630;父進程id:16625; 當前index:1; 當前時間:1528696787.3548 當前進程:16630 我是子進程,當前進程id:16631;父進程id:16630; 當前index:2; 當前時間:1528696787.3555 我是父進程,fork的子進程id: 16631;當前進程id:16630;父進程id:16625; 當前index:2; 當前時間:1528696787.3599 我是父進程,fork的子進程id: 16630;當前進程id:16625;父進程id:15128; 當前index:1; 當前時間:1528696787.3643 當前進程:16625 我是子進程,當前進程id:16632;父進程id:16625; 當前index:2; 當前時間:1528696787.3649 我是父進程,fork的子進程id: 16632;當前進程id:16625;父進程id:15128; 當前index:2; 當前時間:1528696787.3697總結
1.從執行的多次結果得知,程序從外到內創建fork。然后再從內最后一次fork開始退出
2.如一次fork之后,程序的父進程因pcntl_wait阻塞,然后等待本次fork的子進程退出,然后相應的子進程的父進程執行邏輯并退出
3.然后執行本子進程的父進程依次循環2的邏輯退出,最終結束總進程
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28791.html
摘要:多進程消費模型父進程等待并控制子進程的退出思路整理父進程開啟后,直接獲取到子進程的,然后存入數組,子進程出來后直接開啟業務消費代碼,然后退出,然后父進程等待子進程退出,全部退出后父進程結束代碼請在模式下運行子進程的數量如果是資源類型的變量, 多進程消費模型 父進程等待并控制子進程的退出 思路整理 父進程開啟后,直接獲取到子進程的pid,然后存入child數組,子進程fork出來后直接開...
摘要:對編程的理解,應該到深入到操作系統級別。進程控制,我一直都沒有接觸,感覺好高端,今天啃了一下擴展的最簡單的兩個函數,有點心得,記錄一下吧,歡迎拋磚。 對編程的理解,應該到深入到操作系統級別。進程控制,我一直都沒有接觸,感覺好高端,今天啃了一下pcntl擴展的最簡單的兩個函數,有點心得,記錄一下吧,歡迎拋磚。新建代碼文件 pcntl_wait.php,如下: $i = 0; ...
摘要:目的綜上所述,我的目標就是實現基于模式實現的多進程管理工具。備注下文中,父進程統稱為子進程統稱為。最后我們通過下圖來簡單的總結和描述這個多進程實現的過程控制上面實現了多進程和多進程的常駐內存,那如何去管理呢答案多進程通信。 _ | | _ __ __ _ _ __...
摘要:運行模式實現進程前,需了解常見的的運行模式通用網關接口模式模式命令行模式模塊模式作為服務器模塊而進程則是使用命令行模式運行的基本實現中提供了一個擴展,可以利用操作系統的調用來實現多進程。 應用場景 一些耗時任務: 大數據表分表后的統計信息功能 分批發送短信或郵件功能 其他可分目標的任務功能(很多種) 所以我們就需要一個常駐內存的任務管理工具,為了保證實時性,一方面我們讓它一直執行任...
摘要:運行模式實現進程前,需了解常見的的運行模式通用網關接口模式模式命令行模式模塊模式作為服務器模塊而進程則是使用命令行模式運行的基本實現中提供了一個擴展,可以利用操作系統的調用來實現多進程。 應用場景 一些耗時任務: 大數據表分表后的統計信息功能 分批發送短信或郵件功能 其他可分目標的任務功能(很多種) 所以我們就需要一個常駐內存的任務管理工具,為了保證實時性,一方面我們讓它一直執行任...
閱讀 2570·2021-09-06 15:02
閱讀 3200·2021-09-02 10:18
閱讀 2822·2019-08-30 15:44
閱讀 685·2019-08-30 15:43
閱讀 1948·2019-08-30 14:08
閱讀 2758·2019-08-30 13:16
閱讀 1397·2019-08-26 13:52
閱讀 931·2019-08-26 12:21