进程关系

ps -efj  (-j 显示与作业有关的信息)

UID         PID         PPID         PGID        SID         TTY        COMD

用户ID    进程ID     父进程ID     进程组ID    会话ID    终端名称    命令字符串

其中父进程为0的属于内核进程

进程组:每个进程组都有一个组长进程,组长进程结束不代表进程组结束,只有进程组中的最后一个进程结束,进程组才算结束,子进程继承父进程的进程组,可用setpgid(pid_t pid,pid_t pgid)函数设置进程组,注意一个进程只能为它自己或者子进程设置组进程;使用进程组 的好处是,当终端发送一个信号给进程组,就可以通知到进程组中的所有进程,不必每个进程都去通知。

会话:一个或多个进程组的集合,通常由setsid(void)建立一个新会话,这个函数会完成三件事:

1.该进程称为会话首进程 (会话ID即为该进程ID),建立与控制终端连接的会话首进程被称为控制进程

 

2.创建新的进程组,该进程为新进程组的组长进程(如果该进程原本就是个进程组长,这个函数回报错,所以一般先fork,然后终止父进程,再调用该函数)

3.该进程没有控制终端(如果之前该进程有控制终端,也会被切断)

创建会话的好处和进程组类似,都是方便批量管理进程

前台进程组:

该进程组中的进程能够向终端设备进行读写

登录shell通过调用tcsetpgrp()函数设置前台进程组,该函数将终端设备的fd与指定进程组相关联。成为前台进程组的进程其PGID=TPGID,常常可以通过比较他们来判断前台进程组

后台进程组:

一个会话中,除前台进程组,会话首进程以外的所有进程组。该进程组中的终端设备写,但是当试图读终端设备时将会收到SIGTTIN信号,并停止。登录shell可以根据设置在终端上发出一条消息通知用户有进程需要读终端。

前台进程组只有一个,而后台进程组同时可存在多个

孤儿进程:父进程已经终止的进程

僵死进程:由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 那么会不会因为父进程太忙来不及wait子进程,或者说不知道 子进程什么时候结束,而丢失子进程结束时的状态信息呢? 不会。因为UNⅨ提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。机制:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放. 但这样就导致了问题,如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值