会话
会话是一个进程组,或是多个进程组的集合。
- 一个会话可以至少有一个控制终端(物理终端,伪终端)
- 一个会话至少有一个前台进程组(前台就是指能输入的 bin/bash ),其它就是后台进程组
- 一个会话如果连接了一个控制终端,就叫控制进程
因为这个会话首进程 /bin/bash
是连接控制终端(伪终端设置驱动程序+tcp/ip 对端的ssh client
) 的,所以创建的子进程,也会继承 bin/bash
的控制终端(0,1,2标准输出,标准输入,标准错误
)
在终端的输入会影响前台进程组,ctrl+c (会终止前台进程)。
会话的创建
使用 posix_setsid() / setsid(2)创建。
- 不能使用组长进程调用 setsid 函数,硬要调用会报错
- 一般先创建一个子进程,让父进程exit,由子进程调用 setsid
- 调用 setsid 之后,该进程会变成组长进程,同时也会变成会话首进程
- 同时该进程没有控制终端(没有终端了,可以认为它没有连接显示器,没有连接键盘) 它没有控制终端了,你在终端里输入任何数据都没有反应的
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