当前位置: 首页 > 后端技术 > PHP

PHP的pcntl进程控制教程2(pcntl_wait)

时间:2023-03-29 16:50:45 PHP

pcntl_wait介绍#源码官方pcntl_wait——等待或返回fork的子进程状态intpcntl_wait(int&$status[,int$options=0])wait函数抓取当前进程执行直到子进程退出或接收到中断当前进程或调用信号处理程序的信号。如果调用该函数时有子进程已经退出(俗称僵尸进程),则该函数立即返回。子进程使用的所有系统资源都将被释放。请参阅系统的wait(2)手册,了解有关wait如何在您的系统上工作的详细规范。注意:这个函数相当于调用pcntl_waitpid()函数,参数pid的值为-1,没有options参数。参数statuspcntl_wait()会将状态信息存储到status参数中。status参数返回的状态信息可以通过以下函数pcntl_wifexited()、pcntl_wifstopped()、pcntl_wifsignaled()、pcntl_wexitstatus()、pcntl_wtermsig()和pcntl_wstopsig()获取其具体值。options如果您的操作系统(大多数BSD类系统)允许wait3,您可以提供可选的options参数。如果未提供此参数,则等待将用作系统调用。如果wait3不可用,则提供参数选项将无效。options的值可以是0或者后面的两个常量或者两个常量“或”运算的结果(即两个常量都有效)。选项可用值WNOHANG如果没有子进程退出则立即返回。WUNTRACED当子进程退出且未报告其状态时返回。返回值pcntl_wait()返回退出的子进程的进程号,出错时返回-1,如果提供了WNOHANG选项(有wait3的系统)没有子进程可用则返回0。测试代码0,如果fork成功,返回子进程id//父进程逻辑pcntl_wait($status);//父进程必须等待子进程退出才能创建下一个子进程。$child_id=$pid;//子进程的ID$pid=posix_getpid();//获取当前进程Id$ppid=posix_getppid();//进程的父ID$time=microtime(true);echo"I是父进程,fork的子进程id:{$child_id};当前进程id:{$pid};父进程id:{$ppid};当前索引:{$index};当前时间:{$时间}”。PHP_EOL;}else{//$pid=0//子进程逻辑$cid=$pid;$pid=posix_getpid();$ppid=posix_getppid();$myid=getmypid();$time=microtime(true);echo"我是子进程,当前进程id:{$pid};父进程id:{$ppid};当前索引:{$index};当前时间:{$time}".PHP_EOL;//出口;//睡眠(2);}$index++;}loop=1执行结果currentprocess:16604我是子进程,currentprocessid:16605;父进程ID:16604;当前指数:0;当前时间:1528696774.1978我是父进程,fork的子进程id:16605;当前进程号:16604;父进程ID:15128;当前指数:0;当前时间:1528696774.2032loop=2执行结果当前进程:16613我是子进程,当前进程id:16614;父进程id:16613;当前指数:0;当前时间:1528696781.4751当前进程:16614我是子进程,当前进程id:16615;父进程ID:16614;当前指数:1;当前时间:1528696781.4756我是父进程,Fork的子进程id:16615;当前进程号:16614;父进程ID:16613;当前指数:1;当前时间:1528696781.4802我是父进程,fork子进程id:16614;当前进程号:16613;父进程ID:15128;当前指数:0;当前时间:1528696781.4858当前进程:16613我是子进程,当前进程id:16616;父进程ID:16613;当前指数:1;当前时间:1528696781.4863我是fork的父进程,子进程id:16616;当前进程号:16613;父进程ID:15128;当前指数:1;当前时间:1528696781.4913loop=3执行结果当前进程:16625我是子进程,当前进程id:16626;父进程ID:16625;当前指数:0;当前时间:1528696787.3334当前进程:16626我是子进程,当前进程id:16627;父进程ID:16626;当前指数:1;当前时间:1528696787.3338当前进程:16627我是子进程,当前进程id:16628;父进程ID:16627;当前指数:2;当前时间:1528696787.3345我是父进程,fork子进程id:16628;当前进程号:16627;父进程ID:16626;当前指数:2;当前时间:1528696787.3391我是父进程,fork子进程id:16627;当前进程号:16626;父进程ID:16625;当前指数:1;当前时间:1528696787.3434当前进程:16626我是子进程,当前进程id:16629;父进程ID:16626;当前指数:2;当前时间:1528696787.3441我是父进程,fork子进程id:16629;当前进程号:16626;父进程ID:16625;当前指数:2;当前时间:1528696787.3496我是父进程,fork子进程id:16626;当前进程号:16625;父进程ID:15128;当前指数:0;当前时间:1528696787.3543当前进程:16625我是子进程,当前进程id:16630;父进程ID:16625;当前指数:1;当前时间:1528696787.3548当前进程:16630我是子进程,当前进程id:16631;父进程ID:16630;当前指数:2;当前时间:1528696787.3555我是父进程,fork子进程id:16631;当前进程号:16630;父进程id:16625;当前指数:2;当前时间:1528696787.3599我是fork的父进程,子进程id:16630;当前进程号:16625;父进程ID:15128;当前指数:1;当前时间:1528696787.3643当前进程:16625我是子进程,当前进程id:16632;父进程ID:16625;当前指数:2;当前时间:1528696787.3649我是父进程,fork子进程id:16632;当前进程号:16625;父进程ID:15128;当前指数:2;当前时间:1528696787.3697总结1、从多次执行的结果来看,程序从外到内创建了一个fork,然后从里面的最后一个fork退出。2.比如一个fork之后,程序的父进程被pcntl_wait阻塞,然后等待这个fork的子进程退出,然后对应子进程的父进程执行逻辑退出3.然后依次执行子进程的父进程退出循环2的逻辑,最终结束总进程