浅谈unix进程,进程组,会话和控制终端的关系

最近看apue进程关系这一章,觉得有必要写一篇博客做个总结

在unix系统中进程关系比较复杂,根本原因是因为unix是多用户多任务操作系统,对于每一个登陆到系统的用户,都需要进程有效的管理

进程和进程组的关系:

在每一个时刻,任何一个进程都只能属于一个进程组,进程组有组长进程,进程组的ID等于组长进程的ID

一个进程只能为它以及它的子进程设置进程组ID。在它的子进程调用exec函数之一后,它就不能再改变子进程的进程组ID


会话和进程组的关系:

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

一次登陆形成一个会话

一个会话只有一个前台进程组,可以有多个后台进程组

#include <unistd.h>

pid_t setsid(void);

可以创建一个会话

如果调用该函数的进程不是一个进程组的组长,则:

1.该进程变成新会话首进程。

2.该进程称为一个新进程组的组长进程。新进程组ID是该调用进程的进程ID

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

如果调用进程已经是一个进程组的组长,则此函数返回出错。


控制终端,进程组和会话的关系:

1.一个会话可以有一个控制终端(也可以没有终端)。这通常是登陆到其上的终端设备或伪终端设备

2.建立与控制终端连接的会话首进程被称为控制进程

3.一个会话中的几个进程组可被分成一个前台进程组以及一个或几个后台进程组

4.如果一个会话有一个控制终端,则它有一个前台进程组,会话中的其他进程组则为后台进程组

5.无论何时键入终端的中断建(DELETE或Ctrl+C),就会将中断信号发送给前台进程组的所有进程

6.无论何时键入终端的退出键(常常是Ctrl+\),就会将退出信号发送给前台进程组中的所有进程

7.如果终端接口检测到调制解调器已经断开连接,则将挂断信号发送给控制进程(会话首进程)。


关于控制终端的说明,请参阅:

http://blog.csdn.net/liaoxinmeng/article/details/5004743


关于shell执行程序过程



每个用户登陆后,都会启动一个shell进程,它的父进程ID是1,shell进程是建立与控制终端连接的控制进程,将shell的文件描述符0,1,2设置为终端设备

shell先调用fork()创建子进程,子进程调用exec载入新程序到进程空间中执行,但子进程ID不会改变,其父进程依然是shell进程,请注意上图的进程ID,949创建1988,1988创建1989和1990

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值