惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
GbyAI
GbyAI
博客园 - 司徒正美
美团技术团队
Vercel News
Vercel News
IT之家
IT之家
U
Unit 42
Y
Y Combinator Blog
罗磊的独立博客
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
V
Visual Studio Blog
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MyScale Blog
MyScale Blog
博客园 - 叶小钗
A
About on SuperTechFans
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
B
Blog RSS Feed

WangDeer

非机动车交通规则测验 微软 50 周年壁纸是在 macOS上设计的? 「转」西二旗折叠:蜂巢经济学启示录 难得空明 Ubuntu Clean ApidocJs apigroup Support Chinese int(10)里面的10是什么意思? 2021-03-25 「PHP架构师」面试准备 Laravel 上传 Docx 文件,表单验证不通过 4-4 发送信号 4-3 信号集 4-2 编写中断信号处理程序 2022-03-10 面试复盘 4-1 什么是中断信号(软中断) 3-7 进程查看 3-6 SUID特权进程 3-5多进程编写 3-4进程调度 3-3进程exec 3-2进程退出和回收 3-1进程标识与fork 2-3解释器文件 2-2命令行参数与环境参数表 2-1程序与进程 1-1课程介绍 终极复盘 第八章 传承篇 第七章 自由篇 第六章 品牌篇 第五章 作品篇
5-3 会话
王二 · 2022-06-10 · via WangDeer

会话

会话是一个进程组,或是多个进程组的集合。

  1. 一个会话可以至少有一个控制终端(物理终端,伪终端)
  2. 一个会话至少有一个前台进程组(前台就是指能输入的 bin/bash ),其它就是后台进程组
  3. 一个会话如果连接了一个控制终端,就叫控制进程

因为这个会话首进程 /bin/bash 是连接控制终端(伪终端设置驱动程序+tcp/ip 对端的ssh client) 的,所以创建的子进程,也会继承 bin/bash 的控制终端(0,1,2标准输出,标准输入,标准错误

在终端的输入会影响前台进程组,ctrl+c (会终止前台进程)。

会话的创建

使用 posix_setsid() / setsid(2)创建。

  1. 不能使用组长进程调用 setsid 函数,硬要调用会报错
  2. 一般先创建一个子进程,让父进程exit,由子进程调用 setsid
  3. 调用 setsid 之后,该进程会变成组长进程,同时也会变成会话首进程
  4. 同时该进程没有控制终端(没有终端了,可以认为它没有连接显示器,没有连接键盘) 它没有控制终端了,你在终端里输入任何数据都没有反应的

phpdemo19.php

    <?php

    function showPid()
    {
        $pid = posix_getpid();
        fprintf(STDOUT, "pid=%d,ppid=%d,pgid=%d,sid=%d\n",$pid,posix_getppid(),posix_getpgid($pid),posix_getsid($pid));
    }

    showPid();


    $pid = pcntl_fork();
    if ($pid > 0) {
        exit(0);
    }

    if (-1 == posix_setsid()) {
        echo 'error'.PHP_EOL;
        $erro_no = pcntl_errno();
        echo pcntl_strerror($erro_no).PHP_EOL;
    } else {
        echo '会话创建成功'.PHP_EOL;
    }

    showPid();

    while (1) {
        sleep(2);
    }

执行结果,注意观察 pgid,sid 变化

$ php demo19.php 
pid=976,ppid=28,pgid=976,sid=28
会话创建成功
pid=977,ppid=976,pgid=977,sid=977

查看进程信息

ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
## 变成了没有控制终端的进程
laradock     977  0.0  0.1 102524 11020 ?        Ss   03:04   0:00 php demo19.php

会话创建过程