对编程的理解要深入到操作系统层面。过程控制我没接触过,感觉很高端。今天看了一下pcntl扩展最简单的两个功能。我有一些经验。让我记录一下。欢迎抛砖引玉。新建代码文件pcntl_wait.php,如下:$i=0;while($i<2){$pid=pcntl_fork();//父进程和子进程都会执行下面的代码if($pid==-1){//创建子进程错误,return-1die('couldnotfork');}elseif($pid){//父进程会得到子进程ID,所以这里是父进程执行的逻辑pcntl_wait($status);//父进程必须等待子进程退出才能创建下一个子进程。$cid=$pid;//子进程的ID$pid=posix_getpid();//pid和mypid一样,当前进程Id$myid=getmypid();$ppid=posix_getppid();//进程ID的父进程$time=microtime(true);echo"我是父cid:$cidmyid:$myidpid:$pidppid:$ppidi:$i$time\n";}else{//子进程pid得到的$为0,所以这里是子进程的逻辑$cid=$pid;$pid=posix_getpid();$ppid=posix_getppid();$myid=getmypid();$time=微时间(真);echo"我是孩子cid:$cidmyid:$myidpid:$pidppid:$ppidi:$i$time\n";//出口;//睡眠(2);$i++;}php-fpcntl_wait.phprun结果如下:Iamchildcid:0myid:6499pid:6499ppid:6498i:01491394182.2065Iamchildcid:0myid:6500pid:6500ppid:6499i:11491394182.2077我是父母cid:65009myid:649pid:6499ppid:6498i:11491394182.2143我是父母cid:6499myid:6498pid:6498ppid:3471i:01491394182.2211我是子cid:0myid:6501pid:6501ppid:6498i:11491394182.222我是父cid:6501myid:6498pid:6498ppid:3471i:1482进程?参考PHP手册和网友博客的上述代码,可以循环生成子进程,父进程会阻塞等待子进程退出,所以有问题。父进程必须等待一个子进程退出,然后再创建一个个人分析如下:1、运行shell命令(进程ID为3471),生成主进程PID为6498,开始循环i=06498处这次,父进程|fork6499父进程(6498被阻塞),子进程(6499)执行,输出为:childcid:0myid:6499pid:6499ppid:6498i:01491394182.2065然后i++i=1,再次循环并继续循环i=16499此时的父进程|fork6500父进程(被6499阻塞),子进程(6500)执行,输出:childcid:0myid:6500pid:6500ppid:6499i:11491394182.2077然后i++i=2,本次循环结束,返回其主进程64996499要解除阻塞,此时i=1(因为阻塞时i=1,继续执行输出:parentcid:6500myid:6499pid:6499ppid:6498i:11491394182.2143然后i++i=2、本次循环终止,返回其主进程64986498解除阻塞,此时i=0(因为阻塞时i=0),继续执行,输出:parentcid:6499myid:6498pid:6498ppid:3471i:01491394182.2211然后i++i=1,再次循环,继续循环i=16498此时父进程|fork6501父进程(6498阻塞),子进程(6501)执行,输出:childcid:0myid:6501pid:6501ppid:6498i:11491394182.222然后i++i=2,本次循环结束,返回其主进程64986498此时解除阻塞i=1(因为阻塞时i=1),继续执行,输出:parentcid:6501myid:6498pid:6498ppid:3471i:11491394182.2302然后i++i=2,本次循环结束,返回到它的主进程3471,最后命令结束
