Linux 进程间关系
Linux 进程组关系
Linux下进程具有强亲缘关系(例如父子进程,子进程的创建,克隆,终止回收,父进程高度参与)。
Linux下采用进程组结构,组织,管理多进程,一个进程组由一个组长进程与若干个组员进程。
进程组的创建:执行程序(./app)系统就会为该进程创建一个进程组,本进程为组长,子进程为组员。
一个进程中组长的唯一标示:pid = gpid (终端输入 ps ajx 查看进程关系)
pid_t getpgrp(void) // 调用后返回调用进程的组id。
下面展示 调用./app后进程间关系
。
进程组的生命周期:直到组中最后一个进程(离开,转移或终止),进程组中没有进程后,内核回收进程组,释放资源及组id。
进程组关系与进程亲缘关系,没有必然联系(组长和组员可能有亲缘关系,但不是必须的)。
转移: 可以通过系统提供的接口,将一个组员进程转移到任意进程组中。
setpgid(pid, gpid); 通过当前进程pid创建组
Linux 进程会话关系
- 当使用终端执行如(./app)的程序时,其实是调用了fork()指令创建了子进程,然后使用execl()拷贝app的用户空间,执行app的功能。
- 虽然app进程由终端fork出来,但是并不属于同一个进程组,而是属于同一个会话。
- 当执行app程序后使用fork,得到的进程是属于app的子进程,因此拥有与app父相同的gid,此时属于同组进程。
- app父进程为终端进程(受控于控制终端,参与终端会话)终端bash结束会直接影响这类终端进程。
会话的唯一标示: pid == gid == sid
**脱离终端控制:**终端进程要摆脱bash的影响,首先要成立新会话,离开现有会话(从而达到脱离终端控制的目的)
pid_t getsid(pid); // 获取调用进程的会话id
setsid(); // 先为当前进程创建进程组,而后成立新会话
守护进程/精灵进程(系统后台服务进程)
守护进程的生命周期: 相比较于普通进程,生命周期更长,生命周期随操作系统持续(开机启动,关机结束)。
守护进程的核心: 完成系统指定服务,持续运行或周期性运行,保证服务质量,维护系统稳定