IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> linux php 进程进阶(六)进程组 -> 正文阅读

[PHP知识库]linux php 进程进阶(六)进程组

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

进程组

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

// 获取当前进程pid
$pid = posix_getpid();
// 打印当前进程pid,父进程pid,进程组pgid,会话sid
fprintf(STDOUT,"pid=%d,ppid=%d,pgid=%d,sid=%d\n",$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\n",$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 已经结束\n");
            unset($map_pid[$pid]);
        }
        if(empty($map_pid)){
        // 子进程退出完后,父进程退出
           exit(0);
        }

    }
}

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

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:12:05  更:2022-03-15 22:12:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 23:09:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码