会话

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

  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

会话创建过程