进程间关系和守护进程

本文详细介绍了进程组、作业、会话的概念及其相关接口函数,包括如何使用setpgid和setsid进行进程组和会话管理。此外,文章讨论了作业控制的相关信号以及如何在后台运行作业。在守护进程部分,阐述了守护进程的特点,如何创建守护进程,并通过进程状态和终端信息来识别守护进程。
摘要由CSDN通过智能技术生成
一. 进程组/作业/会话
1.进程组

    每一个进程除了有一个进程ID之外, 还属于一个进程组. 进程是一个或多个进程的集合. 通常, 它们与同一个作业向关联, 可以接收来自同一个终端下的各种命令,信号. 每一个进程组都有唯一的进程组 ID. 每一个进程组都可以有一个组长进程. 组长进程的标识是, 其进程组 ID 等于组长进程 ID. 组长进程可以创建一个进程组, 也可以创建该进程组中的进程, 然后终止.只要该组中有一个进程存在, 则该组就存在, 与该组中的组长进程是否存在没有任何关系

2. 相关接口函数

                这里写图片描述
    其中getpgrp 函数用来返回调用进程的进程组 ID, setpid 用来将 pid 进程的进程组 ID 设置为 pgid, 如果两个参数值相等, 则由 pid 指定的进程将会变成进程组组长. 如果 pid 为 0, 则使用调用者的进程 id. 另外, 如果 pgid 为 0, 则由进程 pid 指定的进程 id将会变成进程组 id.一个进程只能为自己的子进程或者为自己设定进程组ID, 但是当这个函数的子进程已经调用了 exec 之后, 父进程就不能再改变子进程的组ID了
    在大多数shell下通常是调用 fork 后让父进程调用 setpgid , 同时也让子进程调用 setpgid.
这里写图片描述    其中 ps 命令常用来显示进程相关信息, 其中选项 a 表示不仅列出当前用户的进程, 也列出其他所有用户进程, x 表示不仅列出有控制终端的进程, 也列出没有控制终端的进程, j 表示列出与作业相关的信息, 同时在上图中可以看出当我们杀死这个进程组中的组长时, 此时该组还是任然存在的(该组中的成员还依旧在). 利用 jobs 命令可以查看后台相关进程

3. 作业

    shell分前台和后台运行的不是进程, 而是作业或者进程组. 一个前台作业可以由多个进程构成, 一个后台作业也可以由多个进程组成, shell可以一次运行一个前台作业和任意多个后台作业, 这就叫做作业控制.
    作业和进程组的区别: 在作业中某个进程创建了一个子进程, 该子进程属于该进程组, 但是该子进程不属于这个作业.一旦作业结束, shell就把自己提到前台, (子进程还在, 但是子进程不属于改作业), 如果原来的前台进程还在, (如果原来的子进程还没有终止), 它将自动成为一个后台进程. 此时我们就可以理解当我们在前台起一个新作业时, 此时shell无法执行, 那是因为shell被放到了后台, 而当改作业退出的时候, shell就被提到了前台.

#include<stdio.h>
#include<unistd.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值