pcntl_fork与pcntl_wait串行分析

<?php
$i = 0;
while($i < 2) {
    $pid = pcntl_fork();
    // 父进程和子进程都会执行以下代码
    if ($pid == -1) { // 创建子进程错误,返回-1
        die('could not fork');
    } else if ($pid) {
        // 父进程会得到子进程号,所以这里是父进程执行的逻辑
        pcntl_wait($status); // 父进程必须等待一个子进程退出后,再创建下一个子进程。
        $cid = $pid; // 子进程的ID
        $pid = posix_getpid(); // pid 与mypid一样,是当前进程Id
        $myid = getmypid();
        $ppid = posix_getppid(); // 进程的父级ID
        $time = microtime(true);
        echo "I am parent cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time \n";
    } else {
        // 子进程得到的$pid为0,所以这里是子进程的逻辑
        $cid = $pid;
        $pid = posix_getpid();
        $ppid = posix_getppid();
        $myid = getmypid();
        $time = microtime(true);
        echo "I am child cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time \n";
        //sleep(1);
    }
    $i++;
}

运行结果如下:

I am child cid:0 myid:44792 pid:44792 ppid:44764 i:0 1588925976.2173
I am child cid:0 myid:44793 pid:44793 ppid:44792 i:1 1588925976.2178
I am parent cid:44793 myid:44792 pid:44792 ppid:44764 i:1 1588925976.2228
I am parent cid:44792 myid:44764 pid:44764 ppid:12022 i:0 1588925976.2272
I am child cid:0 myid:44810 pid:44810 ppid:44764 i:1 1588925976.2274
I am parent cid:44810 myid:44764 pid:44764 ppid:12022 i:1 1588925976.2314

以上代码能够循环产生子进程,并且父进程会阻塞等待子进程退出,这样就产生了一个问题,父进程必须等待一个子进程退出后,再创建另外一个。

首先生成主进程PID为44764,开始循环i=0
44764此时的父进程,fork子进程44792,父进程(44764阻塞),该子进程(44792)执行,
输出:I am child cid:0 myid:44792 pid:44792 ppid:44764 i:0 1588925976.2173

然后i++,i=1,继续循环i=1
44792此时的父进程,fork子进程44793,父进程(44792阻塞),该子进程(44793)执行,
输出:I am child cid:0 myid:44793 pid:44793 ppid:44792 i:1 1588925976.2178

然后i++,i=2,本次循环终止,回到其主进程44792
44792解除阻塞,此时i=1(因为阻塞时i=1),继续执行
输出:I am parent cid:44793 myid:44792 pid:44792 ppid:44764 i:1 1588925976.2228

然后i++,i=2,本次循环终止,回到其主进程44764
44764解除阻塞,此时i=0(因为阻塞时i=0),继续执行
输出:I am parent cid:44792 myid:44764 pid:44764 ppid:12022 i:0 1588925976.2272

然后i++,i=1,再次循环,继续循环i=1
44764此时的父进程,fork子进程44810,父进程(44764阻塞),该子进程(44810)执行,
输出:I am child cid:0 myid:44810 pid:44810 ppid:44764 i:1 1588925976.2274

然后i++,i=2,本次循环终止,回到其主进程44764
44764解除阻塞,此时i=1(因为阻塞时为i=1),继续执行,
输出:I am parent cid:44810 myid:44764 pid:44764 ppid:12022 i:1 1588925976.2314
然后i++,i=2,循环终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值