PHP的pcntl进程控制教程二(pcntl_wait)
生活随笔
收集整理的這篇文章主要介紹了
PHP的pcntl进程控制教程二(pcntl_wait)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
pcntl_wait 簡介
# 來源官方pcntl_wait — 等待或返回fork的子進程狀態(tài)int pcntl_wait ( int &$status [, int $options = 0 ] )wait函數(shù)刮起當前進程的執(zhí)行直到一個子進程退出或接收到一個信號要求中斷當前進程或調用一個信號處理函數(shù)。 如果一個子進程在調用此函數(shù)時已經退出(俗稱僵尸進程),此函數(shù)立刻返回。子進程使用的所有系統(tǒng)資源將 被釋放。關于wait在您系統(tǒng)上工作的詳細規(guī)范請查看您系統(tǒng)的wait(2)手冊。Note: 這個函數(shù)等同于以-1作為參數(shù)pid 的值并且沒有options參數(shù)來調用pcntl_waitpid() 函數(shù)。參數(shù) status pcntl_wait()將會存儲狀態(tài)信息到status 參數(shù)上,這個通過status參數(shù)返回的狀態(tài)信息可以用以下函數(shù) pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig()以及 pcntl_wstopsig()獲取其具體的值。options 如果您的操作系統(tǒng)(多數(shù)BSD類系統(tǒng))允許使用wait3,您可以提供可選的options 參數(shù)。如果這個參數(shù)沒有提供,wait將會被用作系統(tǒng)調用。如果wait3不可用,提供參數(shù) options不會有任何效果。options的值可以是0 或者以下兩個常量或兩個常量“或運算”結果(即兩個常量代表意義都有效)。options可用值 WNOHANG 如果沒有子進程退出立刻返回。 WUNTRACED 子進程已經退出并且其狀態(tài)未報告時返回。 返回值 pcntl_wait()返回退出的子進程進程號,發(fā)生錯誤時返回-1,如果提供了 WNOHANG作為option(wait3可用的系統(tǒng))并且沒有可用子進程時返回0。測試代碼
<?php /*** Created by PhpStorm.* User: Object* Date: 2018/6/11* Time: 10:28*/ if (strtolower(php_sapi_name()) != 'cli') {die("請在cli模式下運行"); }$index = 0; $loop = 1; while ($index < $loop) {echo "當前進程:" . getmypid() . PHP_EOL;$pid = pcntl_fork(); //fork出子進程if ($pid == -1) { // 創(chuàng)建錯誤,返回-1die('進程fork失敗');} else if ($pid) { // $pid > 0, 如果fork成功,返回子進程id// 父進程邏輯pcntl_wait($status); // 父進程必須等待一個子進程退出后,再創(chuàng)建下一個子進程。$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 執(zhí)行結果
當前進程:16604我是子進程,當前進程id:16605;父進程id:16604; 當前index:0; 當前時間:1528696774.1978我是父進程,fork的子進程id: 16605;當前進程id:16604;父進程id:15128; 當前index:0; 當前時間:1528696774.2032loop = 2 執(zhí)行結果
當前進程: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 執(zhí)行結果
當前進程: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.從執(zhí)行的多次結果得知,程序從外到內創(chuàng)建fork。然后再從內最后一次fork開始退出2.如一次fork之后,程序的父進程因pcntl_wait阻塞,然后等待本次fork的子進程退出,然后相應的子進程的父進程執(zhí)行邏輯并退出
3.然后執(zhí)行本子進程的父進程依次循環(huán)2的邏輯退出,最終結束總進程
總結
以上是生活随笔為你收集整理的PHP的pcntl进程控制教程二(pcntl_wait)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中JScrollPane不显示水
- 下一篇: C++之引用的详解