php 多进程 返回值,PHP 多进程的实现代码一例

本文详细介绍了多进程编程中的fork函数,解释了如何创建和管理子进程。通过示例代码展示了如何使用pcntl_fork创建三个并发执行的进程,并讨论了进程间的独立性和同步问题。重点阐述了fork后的父子进程特性,包括pid的返回值和数据空间的独立。最后,探讨了进程的执行顺序依赖于操作系统的调度算法,以及如何通过同步原语实现父子进程的协同工作。
摘要由CSDN通过智能技术生成

代码:

复制代码 代码示例:

//while(1)//循环采用3个进程

//{

//declare(ticks=1);

$bWaitFlag = FALSE; // 是否等待进程结束

//$bWaitFlag = TRUE; // 是否等待进程结束

$intNum = 3; // 进程总数

$pids = array(); // 进程PID数组

for($i = 0; $i

// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息

$pids[$i] = pcntl_fork();

/*if($pids[$i])//父进程

{

//echo $pids[$i]."parent"."$i -> " . time(). "\n";

}

*/

if($pids[$i] == -1){

echo "couldn't fork". "\n";

}elseif(!$pids[$i]){

sleep(1);

echo "\n"."第".$i."个进程 -> " . time(). "\n";

//$url=" http://xxx/comments.php?p=".$i;//抓取页面的例子

//$content = file_get_contents($url);

//file_put_contents('message.txt',$content);

//echo "\n"."第".$i."个进程 -> " ."抓取页面".$i."-> " . time()."\n";

exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程

}

if ($bWaitFlag){

pcntl_waitpid($pids[$i], $status, WUNTRACED);

echo "wait $i -> " . time() . "\n";

}

}

//sleep(1);

} //by www.jbxue.com

?>

fork:操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像是兄弟关系,这两个进程共享代码空间,但是数据空间是相互独立的,子进程数据空间的内容是父进程的完整拷贝,指令指针也完全相同。

但只用一点不同,如果fork成功, 子进程fork的返回值是0 父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错,

2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因。

至于那一个最先运行,可能与操作系统有关,而且这个问题在实际应用中并不重要,如果需要父子进程协同,可以通过原语的办法解决。

fork前父进程的东西子进程可以继承,而在fork后子进程没有任何和父进程的继承关系了。在子进程里创建的东西是子进程的,在父进程创建的东西是父进程的。可以完全看成两个进程。

在程序段里用了fork();之后程序出了分岔,派生出了两个进程。具体哪个先运行就看该系统的调度算法了。

可以这么认为,在运行到”pid=fork();”时系统派生出一个跟主程序一模一样的子进程。该进程的”pid=fork();”一句中 pid得到的就是子进程本身的pid;子进程结束后,父进程的”pid=fork();”中pid得到的就是父进程本身的pid。因此改程序有两行输出。

fork()函数复制了当前进程的PCB,并向父进程返回了派生子进程的pid。而且根据上面”corand”兄的提示,父子进程并行,打印语句的 先后完全看系统的调度算法。打印的内容控制则靠pid变量来控制。因为我们知道fork()向父进程返回了派生子进程的pid,是个正整数;而派生子进程 的pid变量并没有被改变。这一区别使得我们看到了他们的不同输出。

1,派生子进程的进程,即父进程,其pid不变;

2,对子进程来说,fork返回给它0,但它的pid绝对不会是0;之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;

3,fork之后夫子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。

认为子进程结束后父进程才从fork返回的,这是不对的,fork不是这样的,vfork才这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值