一组进程形成一个进程组,一组进程组形成一个会话,即一个会话中可以包括多个进程组。

1)创建会话

创建一个会话需要注意以下6点注意事项:1.调用进程不能是进程组组长(不能是父进程),该进程变成新会话首进程(session header) ,若调用进程是组长进程,则出错返回;2.该进程成为一个新进程组的组长进程;3.需有root权限(ubuntu不需要);4.新会话丢弃原有的控制终端,该会话没有控制终端;5.建立新会话时,先调用fork,父进程终止,子进程调用setsid。

2getsid函数

作用:获取进程所属的会话ID。

pid_t getsid(pid_t pid); 成功:返回调用进程的会话ID;失败:-1,设置errno

pid为0表示查看当前进程session ID

ps ajx命令查看系统中的进程。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。

组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程。

3setsid函数

创建一个会话,并以自己的ID设置进程组ID,同时也是新会话的ID

pid_t setsid(void);  成功:返回调用进程的会话ID;失败:-1,设置errno

调用了setsid函数的进程,既是新的会长,也是新的组长。

//fork一个子进程,并使其创建一个新会话。查看进程组ID、会话ID前后变化    

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(void)
{pid_t pid;if ((pid = fork())<0) {perror("fork");exit(1);} else if (pid == 0) {printf("child process PID is %d\n", getpid());printf("Group ID of child is %d\n", getpgid(0));printf("Session ID of child is %d\n", getsid(0));sleep(10);setsid();       //子进程非组长进程,故其成为新会话首进程,且成为组长进程。该进程组id即为会话进程printf("Changed:\n");printf("child process PID is %d\n", getpid());printf("Group ID of child is %d\n", getpgid(0));printf("Session ID of child is %d\n", getsid(0));sleep(20);exit(0);}return 0;
}

[root@localhost 01_session_daemon_test]# ./session

child process PID is 20303

Group ID of child is 20302

Session ID of child is 12137

[root@localhost 01_session_daemon_test]# Changed:

child process PID is 20303

Group ID of child is 20303

Session ID of child is 20303

[root@localhost 01_session_daemon_test]# ps ajx

PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND

12131  12137  12137  12137 pts/2     20436 Ss       0   0:01 -bash

分析:可以看出shell进程(pts/2设备终端进程,init进程fork、exec后形成)的进程ID为12137,进程组ID为12137,会话ID为12137;shell进程fork后的子进程exec去执行上面的程序./session,即父进程。此时父进程的进程组ID为12137,会话ID为12137;父进程fork后产生了子进程,此时父进程与子进程成立一个进程组,因此父进程的组ID在fork后立即变为自己进程ID,即为20302;生成的子进程组ID即为其父进程ID,会话ID仍然不变,为12137。至此会话12137里面包含了两个进程组,一个为shell进程,另一个为父子进程。子进程通过函数setsid( )创建会话,则该子进程的会话ID发生变化(新的会话),进一步导致该进程成为了一个新的进程组组长,其进程组组ID也变为了自己进程ID,同时该子进程(新创建的会话)没有控制终端。

会话(session)相关推荐

  1. WebService大讲堂之Axis2(6):跨服务会话(Session)管理

    在<WebService大讲堂之Axis2(5):会话(Session)管理>一文中介绍了如何使用Axis2来管理同一个服务的会话,但对于一个复杂的系统,不可能只有一个WebService ...

  2. securecrt切换会话(session)的显示方式

    securecrt切换会话(session)的显示方式 Window(窗口)-> Tabs(选项卡)/Tile Vertically(垂直平铺)/Tile Horizontally(水平平铺)/ ...

  3. Cookie和会话Session

    Cookie和会话Session Cookie Cookie是识别客户端的特定用户. 1.每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端.实际上大多数的应用都是用 Cookie ...

  4. PHP 会话(session 时间设定)使用入门

    PHP 会话(session 时间设定)使用入门 在PHP开发中对比起Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Sess ...

  5. 浅谈IM软件业务知识—会话session的概念,附一张IM软件的层次图

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

  6. emqttd 0.9.0版本的会话(Session)、消息队列(MQueue)、飞行窗口(Inflight Window)设计

    emqttd 0.9.0版本重新设计了MQTT连接会话管理 每个MQTT客户端连接,不管是否持久的(Persistent),都启动一个连接会话进程. 该会话进程管理: 客户端的全部订阅(Subscri ...

  7. vim 保存会话(session)学习笔记

    @[TOC](vim 保存会话(session)学习笔记) 保存项目信息 保存和加载会话信息session 会话信息:当前编辑环境的空窗口.所有的缓冲区.当前目录.折叠(fold)相关的信息.帮助窗口 ...

  8. 连接数process与会话session

    1.连接数与会话的关系     在已建立的连接上,建立会话.     1个process对应1个或者对于1个的session.     Oracle的sessions和processes的关系是:   ...

  9. php会话(session)生命周期概念介绍及设置更改和回收

    http://www.169it.com/article/8429580816135935852.html https://my.oschina.net/jiec/blog/227252 sessio ...

  10. mysql中数据库database、实例instance、会话session的关系

    1. No suitable driver found for http://127.0.0.1:3306/test jdbc_url错误,jdbc走自己的协议. 正确的路径应该是:jdbc:mysq ...

最新文章

  1. 区块链中的“智能合约”有何应用?
  2. python3在线-Python 3中的新功能
  3. 不含抽象方法的抽象类 java_Java:抽象类继承非抽象类,且不包含抽象方法有何负面作用吗?...
  4. LNMP构架概述及相关服务的搭建(附带搭建论坛实验)
  5. rmi远程反序列化rce漏洞_Oracle WebLogic 反序列化远程命令执行漏洞预警
  6. Istio 首次安全评估结果公布
  7. COSC 1047 – Winter 2019 – Assignment
  8. Jquery调用ajax参数说明
  9. 【使用工具推荐】使用什么录像软件录制屏幕
  10. C/C++[codeup 2069]中位数
  11. 微pe工具箱 系统安装教程_微pe工具箱怎么安装win10系统?微pe工具箱安装win10系统详细教程...
  12. html动态图片置于底层,求设置图片为“浮于文字下方,居中,置于底层的代码。...
  13. gif透明背景动画_如何利用premiere制作GIF动态图片
  14. GT540M最新驱动(windows XP 32位),安装NDIVIA安装程序无法继续解决方法
  15. 如何判断一件事重要还是紧急?
  16. 洗碗机,加速中国化才能更适合中国厨房
  17. 三次改变世界、却被无情出局的程序员
  18. 橱柜高度与身高对照表_橱柜高度与身高对照表 橱柜高度怎么根据身高定制?...
  19. 性能测试工具操作数据库(十)-Loadrunner与Redis
  20. AWTRIX像素屏时钟搭建

热门文章

  1. B/S和C/S架构图解
  2. 关于eclipse的indigo版中文注释时字体太小的问题(转)
  3. android 编译共享ccache的缓存
  4. android_Text
  5. apache arm 交叉编译_MacOS 下交叉编译的折腾笔记
  6. html dom概念,js学习之HTML DOM的一些基础概念
  7. 更改mysql数据库存放位置_更改mysql数据库存放位置
  8. python方差的计算公式为什么减一_样本标准差分母为何是n-1
  9. java applet 换行_Java复习题
  10. 服务器 raid 1t硬盘吗,用了4块1T的硬盘,做了raid5,显示有2.7T,但是分区做完系统后,有700多G不能动...