linux php 进程进阶(六)进程组

14 篇文章 0 订阅

linux php 进程进阶(六)进程组

进程组

进程组,就是一个或是多个进程的集合,一个进程都有一个标识组ID,表示该进程属于哪个进程组
bash进程启动之后,它会自己setsid把自己设置为会话首进程,也会设置自己为组长进程

// 获取当前进程pid
$pid = posix_getpid();
// 打印当前进程pid,父进程pid,进程组pgid,会话sid
fprintf(STDOUT,"pid=%d,ppid=%d,pgid=%d,sid=%d
",$pid,posix_getppid(),posix_getpgid($pid),posix_getsid($pid));

执行后可以发现由于 /bin/bash 进程启动时会调用setsid函数把自己设置为会话首进程,也会设置自己为组长进程,所有看到执行demo1.php 进程的父进程是29228 因为demo1.php在bash进程下执行,会话进程也是29228,使用echo $$ 打印当前 bash 进程pid 为 29228.

为什么pgid 不等于29228 呢?
上面我们说过/bin/bash 启动后会调用 setsid 函数设置自己为会话首进程和组长进程,但是自己脚本显示的组进程却不是/bin/bash 的pid,这是因为脚本执行会调用 setpgid 函数把当前进程设置为组进程,所以显示的pgid不是29228 而是 2893
在这里插入图片描述

接下来我们来看个例子

function show(){
	// 获取当前进程pid
    $pid = posix_getpid();
    //打印pid,ppid,pgid,sid
    fprintf(STDOUT,"pid=%d,ppid=%d,pgid=%d,sid=%d
",$pid,posix_getppid(),posix_getpgid($pid),posix_getsid($pid));
}
show();
$map_pid = [];
// fork 子进程
$pid = pcntl_fork();
//父进程pid大于0
if($pid > 0){
   // 把父进程pid 存入数组方便后续操作
   $map_pid[$pid] = $pid;
   // 在父进程中fork 子进程 得到两个兄弟进程
   $pid =  pcntl_fork();
   if($pid >0){
        // 存储父进程pid
        $map_pid[$pid] = $pid;
   }else{
        //获取当前子进程pid
        $pid = posix_getpid();
        //设置当前子进程为组长进程
        posix_setpgid($pid,$pid);
        //在当前子进程中 fork 子进程,
        $pid = pcntl_fork();
        if($pid > 0){
            $map_pid[$pid] = $pid;
        }
    }
}

show();

if($pid > 0){
    
    while(1){
    // 子进程退出回收资源,防止孤儿进程
       $pid =  pcntl_waitpid(-1, $status);

        if($pid > 0){
            print("pid= $pid 已经结束
");
            unset($map_pid[$pid]);
        }
        if(empty($map_pid)){
        // 子进程退出完后,父进程退出
           exit(0);
        }

    }
}

执行上面代码我们可以通过 posix_setpgid 函数设置进程为组长进程,需要传入两个参数,第一个是进程pid,第二个是要设置为组长进程的pid
在这里插入图片描述

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值