67-会话

1. 会话的基本概念

前面已经学过,进程组是一个或多个进程的集合。而会话(session),是一个或多个进程组的集合。创建进程组的进程,是进程组组长,而创建会话的进程,是会话长,通常我们不说会话长,而是称其为会话首进程,用英文其实更加确切——session leader.

图 1 展示了一个会话。


这里写图片描述
图1 进程组和会话中的进程安排

图 1 中的会话,可以使用以下命令形成:

$ cat | cat &
$ cat | cat | cat

可以使用命令 ps ajx | sed '1p;/cat$/!d' 查看结果:


这里写图片描述
图1 查看 cat 进程

从图1 中可以看到所有的 cat 进程都同属一个会话 2391. 接下来,使用命令 ps ajx | sed '1p;/2391/!d' 查看该会话中的所有进程,如果图 2 所示。


这里写图片描述
图2 会话 2391 中的所有进程

图 2 中可以看到会话 2391 下面有 6 个进程,三个进程组(2391,6173,6176),其中 session leader 是 bash 进程,它是该会话的创建者,这也正是在前面的博文中提到可以视一个终端为一个会话的原因。

另外注意到进程 6475,也就是执行 ps 那一条复合命令的进程,它不属于会话 2391,而是属于会话 5653 中。因为这条命令是在另一个终端中执行的。

2. 创建会话

2.1 函数 setsid

函数 pid_t setsid(void) 可以用来创建一个新会话。需要注意的是,调用此函数的进程不能是进程组组长,否则会失败。

如果调用者调用该函数,调用者进程就会创建新的会话,这将发生下面 3 件事:

  • (1) 该进程变成新会话的 session leader,此时,该进程是新会话中的唯一进程。
  • (2) 该进程成为新进程组的组长。也即新进程组 id 等于该进程 id.
  • (3) 该进程没有控制终端(控制终端的概念后面会说)。如果在调用 setsid 之前该进程有一个控制终端,那么这种联系也被切断。

2.2 函数 getsid

该函数的原型是 pid_t getsid(pid_t pid),它能够获取进程 pid 的会话 id。但是,如果进程 pid 和调用进程不在同一个会话,调用此函数失败。通常 pid 的值传 0,表示获取调用进程所在的会话 id.

3. 总结

  • 理解什么是会话
  • 知道如何创建会话

练习1:完成本文中的实验。
练习2:尝试使用函数 setsid 创建一个会话。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值