首页 / PHP / php里进程创建和分析
php里进程创建和分析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php里进程创建和分析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3226字,纯文字阅读大概需要5分钟。
内容图文
php进程创建
Linux系统中,进程的执行模式划分为用户模式和内核模式,当进程运行于用户空间时属于用户模式,
如果在用户程序运行过程中出现系统调用或者发生中断事件,就要运行操作系统(即核心)程序,进程的运行模式就变为内核模式
在该模式下运行的进程可以执行机器特权指令,而且该进程的运行不受用户的干预。
pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同
成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程调用函数创建进程的时候,函数执行是有时间的,而新的进程刚好是在函数执行开始和结束之间创建出来的,
这样,新的进程也执行了这个函数,所以函数也需要有返回值。
那么对于该函数一次执行之后,父进程和子进程都会受到该函数的返回值
由于父进程创建了子进程,而子进程并没有创建新的进程,所以子进程对于这个函数的返回结果是没有的,
所以就给他赋了一个0
而父进程创建了子进程,子进程是存在pid的,所以就得到了那个进程的pid
下面不考虑进程创建失败的情况
<?phpecho "###\n";echo posix_getpid();echo "\n------------\n";$i=0;while($i<2){ $pid = pcntl_fork(); echo "now pid:".sprintf("%5d",posix_getpid())."--->父pid:".sprintf("%5d",posix_getppid())."--->fork_return:".sprintf("%5d",$pid)."----->p_".$i++.PHP_EOL; }exit;
输出和简析
###15280 ------------now pid:15280--->父pid:14413--->fork_return:15281----->p_0 now pid:15281--->父pid:15280--->fork_return: 0----->p_0 now pid:15280--->父pid:14413--->fork_return:15282----->p_1 now pid:15282--->父pid:15280--->fork_return: 0----->p_1 now pid:15281--->父pid:15280--->fork_return:15283----->p_1 now pid:15283--->父pid:15281--->fork_return: 0----->p_1 发现打印了4次p_1 分析 当前pid 15280i=0时记为step1 15280分裂成15280(pcntl_fork()返回15281) 15280分裂成15281(pcntl_fork()返回0) i=1时记为step2 step1的15280分裂成15280(pcntl_fork()返回15282) step1的15280分裂成15282(pcntl_fork()返回0) step1的15281分裂成15281(pcntl_fork()返回15283) step1的15281分裂成15283(pcntl_fork()返回0)
返回0的表示创建了新的子进程在子进程的返回
现在我们只要2个进程(更多也原理一样)
如果使用循环
比如我们要5个进程
<?phpecho "###\n";echo posix_getpid();echo "\n------------\n";$i=0;while($i<5){ $pid = pcntl_fork(); echo "now pid:".sprintf("%5d",posix_getpid())."--->父pid:".sprintf("%5d",posix_getppid())."--->fork_return:".sprintf("%5d",$pid)."----->p_".$i++.PHP_EOL; //子进程里的返回,不再进行while的pcntl_fork if($pid == 0){ echo posix_getpid()." is a child procress!\n"; return ''; } }exit;?>
输出
###15262 ------------now pid:15262--->父pid:14413--->fork_return:15263----->p_0 now pid:15263--->父pid:15262--->fork_return: 0----->p_015263 is a child procress!now pid:15262--->父pid:14413--->fork_return:15264----->p_1 now pid:15264--->父pid:15262--->fork_return: 0----->p_115264 is a child procress!now pid:15262--->父pid:14413--->fork_return:15265----->p_2 now pid:15265--->父pid:15262--->fork_return: 0----->p_215265 is a child procress!now pid:15262--->父pid:14413--->fork_return:15266----->p_3 now pid:15262--->父pid:14413--->fork_return:15267----->p_4 now pid:15267--->父pid:15262--->fork_return: 0----->p_415267 is a child procress!now pid:15266--->父pid:15262--->fork_return: 0----->p_315266 is a child procress!
这时由 15262产生了15263,15264,15265,15266,15267
可以看出所有子进程都在15262里fork出的,是15262的直接子进程
内容总结
以上是互联网集市为您收集整理的php里进程创建和分析全部内容,希望文章能够帮你解决php里进程创建和分析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。