該函數建立子進程具體fork的過程:php
(1)調用該函數即建立一個子進程,建立成功父進程返回子進程的pid,子進程返回0; (2)建立子進程實際上對父進程的一個拷貝,共享代碼空間,拷貝父進程的數據,也就是說父進程改變父進程的數據,子進程改變子進程的數據變量等;
代碼示例:併發
<?php $curr_pid = posix_getpid();//獲取當前的進程id //將當前進程的id寫入文件中 echo '當前進程:'.$curr_pid.PHP_EOL; //開始建立子進程 $son_pid = pcntl_fork();//返回子進程的id //查看當前進程 echo '建立子進程以後當前的進程爲:'.posix_getpid().PHP_EOL; //建立了子進程以後 if($son_pid > 0){ //父進程fork成功返回子進程的id,此爲父進程的執行邏輯 echo '子進程id:'.$son_pid.PHP_EOL; }elseif($son_pid = 0){ //子進程fork後返回的pid是0,所以爲子進程執行邏輯 }else{ //$son_pid=-1的時候,表明fork子進程失敗 }
示例代碼分析:函數
(1)發現建立了子進程以後,系統會切換到子進程中,而子進程中的代碼是從含有pcntl_fork函數的那行執行的 (2)建立子進程以後,子進程的代碼段是拷貝pcntl_fork函數及以後的代碼段,以前的代碼段並不拷貝,可是具體的數據變量子進程仍然會拷貝 (3)可見,fork以後程序會分叉執行,即子進程執行