UNIX环境高级编程学习笔记七_进程关系

一. 用户登录程序

运行过程:

  1. 系统启动后,内核创建ID位1的init进程,并使系统进入多用户模式
  2. init进程读取/etc/ttys文件,其对每个允许登录的终端设备,init调用一次fork。它所生成的子进程则运行getty程序
  3. 最后getty程序调用login程序,为用户登录准备好环境
    登录过程如下:
    login登录过程

二. 会话

会话是由一个或者多个进程组的集合。
会话操作函数:

#inlcude<unistd.h>
pid_t setsid(void);               //建立会话函数
pid_t getsid(void);               //获取新会话的进程组长id

如果进程不是会话组的组长,则函数会创建一个新会话,并成为新会话的组长。当创建者是进程组组长时,必须生成一个子进程,用子进程继承了当前组长进程,使其ID改变了,便于创建新进程。

三. 作业控制

以下为作业控制功能总结图:
作业控制
简单图解如下:

  • 登录shell前一系列工作参考前文中的login执行过程
  • 登入shell后,我们可以通过shell创建前台和后台进程,同时为当前控制终端分配进程组
  • 前后台进程都是shell的子进程,所以当子进程状态发生变化时,父进程将收到相应的状态变化标志
  • 终端产生的信号对后台可能起作用,但对前台基本上都会有影响

以下展示shell执行时的程序:
首先,输入:

ps -o pid,ppid,pgid,sid,comm

其输出如下:
在这里插入图片描述
我们可以发现,cat和ps的父进程都为bash进程,它们都属于当前会话,但署于不同的进程组。同时,cat和ps进程都将前台作业放入自己的进程控制组,并自己作为进程控制组组长。

四. 部分习题解答

9.2 子进程建立一个新的会话
这里出现一个问题:当子进程建立一个新的会话,而子进程再创建子进程时,孙子进程所属于的会话仍然是其祖父进程,而非其父进程所在的会话。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值