APUE(第九章)进程关系

终端登录

网络登录

进程组

同一进程组中的各进程接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID,进程组ID类似于进程ID,是一个正整数,存放在pid_t中

#include <unistd.h>
pid_t getpgrp(void);//返回值:调用进程的进程组ID

pid_t getgid(pid_t pid);//成功:返回pid的gid,出错返回-1
  • 若pid是0,返回调用进程的进程ID,等价于getgrp();
  • 每个进程组有一个组长进程。组长进程组ID等于其进程ID。
  • 进程组组长可以创建一个进程组,然后创建该组的进程,然后终止。
    • 只要在某个进程组中有一个进程存在,则该进程组就存在,这与组长进程是否终止无关
    • 从进程组创建开始到其最后一个进程离开为止的时间区间称为进程组生命周期。
    • 某个进程组中的最后一个进程可以终止,也可以转移到另一个进程组。

进程加入一个现有进程组或者创建一个新进程组

#include <unistd.h>
int setpgid(pid_t pid,pid_t pgid);//成功;返回0,出错-1
  • 将pid得进程组设置为pgid。
  • 如果这两个参数相等则由pid指定得进程变成进程组组长
  • 如果pid=0,使用调用者本身进程ID
  • 如果pgid=0,则由pid指定得进程ID用作进程组ID
  • 一个进程只能为他自己或者或者他的子进程设置进程组ID。

会话

会话是一个或多个进程组得集合,如下图所示

  • 会话ID为sid

shell管道可以将几个进程编为一组,比如proc1 | proc2 或者proc3 | proc4 | porc5,proc1 与proc2 均为未运行得程序名,,Linux系统中查看父进程ID,进程ID,进程组ID,会话ID的方法:ps ajx

进程调用setsid函数建立一个新会话

#include <unistd.h>
pid_t setsid(void);//成功返回进程组ID,出错返回-1
  • 该进程会变成会话首进程,此时该进程是新会话中得唯一进程

  • 该进程称为一个新进程组的组长进程。新进程组ID是调用该会话的进程ID

  • 该进程没有控制终端。如果调用setsid之前该进程有一个控制终端,那么这种联系也被切断

  • 如果该调用进程是一个进程组组长,则此函数返回出错,为了保证不出现这种情况,通常先调用fork,然后使其父进程终止,子进程继续。

    • 因为子进程继承了父进程ID,而其进程ID是新配的,二者不可能相等,保证了子进程不是一个进程组组长
  • 会话首进程ID视为会话ID

返回会话首进程的进程组ID

#include <unistd.h>
pid_t getsid(pid_t pid);//成功返回会话首进程进程组ID,出错-1
  • 若pid为0, 返回调用者会话首进程组ID
  • pid不属于调用者所在的会话,则不能得到会话首进程组ID

控制终端

注意

  • 一个会话可以有一个控制终端。这终端设备(终端登录)或伪终端(网络登录)
  • 建立与控制终端连接的会话被称为控制进程组
  • 一个会话的几个进程组可被分为一个前台进程组以及一个或多个后台进程组
  • 如果一个会话有一个控制终端,则它有一个前台进程组,其他进程组为后台进程组
  • 无论何时键入终端的中断健(Delete,ctrl+c),都会将中断信号发送至前台进程组的所有进程
  • 无论何时键入终端的中退出键(ctrl+c),都会将中断信号发送至前台进程组的所有进程
  • 如果终端接口检测到调制解调器(或网络)断开连接,则将挂断信号发送至控制进程(会话首进程)

函数tcgetpgrp、tcsetpgrp和tcgetsid

#include <unistd.h>
pid_t tcgetpgrp(int fd);//成功返回前台进程组ID出错-1
int tcsetpgrp(int fd,pid_t pgrpid);//成功返回0,出错-1
  • tcgetpgrp返回前台进程组ID,与fd上打开终端相连

作业控制

shell执行程序

孤儿进程组

FreeBSD实现

参考

《APUE》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值