前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是会话

什么是会话

作者头像
北溟有鱼QAQ
发布2021-06-10 15:46:29
1.2K0
发布2021-06-10 15:46:29
举报
文章被收录于专栏:北溟有鱼QAQ

PHP中的会话

概念

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

  • 一个会话可以至少有一个控制终端[物理终端,伪终端]
  • 一个会话至少有一个前台进程组[前台就是指能输入的bin/bash],其它就是后台进程组
  • 一个会话如果连接了一个控制终端,就叫控制进程。因为这个会话首进程/bin/bash是连接控制终端[伪终端设置驱动程序+tcp/ip 对端的ssh client]的,所以创建的子进程也会继承bin/bash的控制终端pts/[0,1,2标准输出,标准输入,标准错误]。又因为连接了终端,所以在终端的输入会影响前台进程组,比如 ctrl+c 发送信号退出进程

技术点

1、使用 posix_setsid()函数设置当前进程为会话首进程

2、当执行php xxx.php 时,默认系统会把当前的进程设置为会话首进程(使用strace查看),所以当前会话首进程不能使用posix_setsid 创建为会话首进程,只能使用子进程调用此函数

3、当调用此函数后,这个进程会变成组长进程,并设置为会话首进程

4、当调用此函数后,该进程不会存在控制终端(可以理解为没有输入、输入设备)

代码

没有setsid的程序

代码语言:javascript
复制
function show()
{
    $pid = posix_getpid();
    //pid当前进程id  ppid 父进程id pgid 会话组id  sid 进程的会话id
    fprintf(STDOUT,"pid=%d,ppid=%d,pgid=%d,sid=%d\n",$pid,posix_getppid(),posix_getpgid($pid),posix_getsid($pid));
}

$pid = pcntl_fork();

//父子进程都打印
show();
while (1){
    ;
}

我们通过截图可以看到,18880是18879的子进程,18880和18879的组ID和会话ID是一样的,因为父进程是当前bash进程的子进程,所以继承了父进程的会话ID,而利用pcntl_fork 创建出的子进程则又继承了父进程的信息,所以看到的则是一样的


设置setsid的程序

代码语言:javascript
复制
function show()
{
    $pid = posix_getpid();
    //pid当前进程id  ppid 父进程id pgid 会话组id  sid 进程的会话id
    fprintf(STDOUT,"pid=%d,ppid=%d,pgid=%d,sid=%d\n",$pid,posix_getppid(),posix_getpgid($pid),posix_getsid($pid));
}

show();

$pid = pcntl_fork();

//让父进程退出,满足技术点第二点
if($pid>0){
    exit(200);
}

//创建成功返回会话id,否则返回 -1
$num = posix_setsid();

if($num == -1){
    var_dump('创建会话失败');
}else{
    var_dump('创建会话成功');
}
show();
while (1){
    ;
}

通过上面截图可以看到,子进程19578的 pgid和sid 都是19578,也就满足上面提到技术点的第三点,将自己设置为组长进程和会话首进程

通过命令ps -exj 可以看到,设置setsid的这个进程是没有 pts 控制终端的,满足技术点第四点

注意

19578这个进程的父id是1号进程,但并不意味着,这个进程是孤儿进程,而是由一号进程接管的会话首进程

本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.umdzz.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PHP中的会话
    • 概念
      • 技术点
        • 代码
          • 注意
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档