进程间的关系有哪些
之前学过父进程通过fork创建子进程,其实还有一种进程间关系是进程组。
进程组可以接受同一终端的各种信号,比如ctr+c就是给一个进程组发的中断信号而不是个单个进程,所以说进程组通常和一个作业相关联。
组长进程可以创建进程组,但是组内只要有进程就一直存在。
例如在shell界面下用两个管道执行三个命令,就要在shell进程下fork三个子进程,这三个子进程同属一个进程组,为了完成一项作业。
作业
shell分前后台来控制的是作业或者进程组。可以同时运行一个前台作业和多个后台作业。一旦作业完成,shell讲自己提到前台运行,如果作业的子进程还没结束,但是已经不属于作业并在后台运行。
前台和后台作业的区别?
前台作业占用了shell,在程序运行期间不能执行命令。后台作业则不能从标准输入读取数据。
会话
Session是比作业更高层的抽象,一个会话包括一个会话首进程,一个前台进程组和任意个后台进程组。
SID字段标识一个会话,bash通常是会话首进程,也是其他进程的父进程。
作业控制操作
./xx &
以后台方式运行可执行程序
jobs
查看作业
fg 1
提到前台运行
ctr + z
提到后台运行
bg 1
配合jobs,让后台暂停的进程运行
理解信号的递达
之前说过进程收到信号先修改PCB的pending表,然后主控制流程收到信号产生中断切换到内核态,之后在切换回用户态之前才检查pending表是否有未处理的信号。
这里前提条件是主控制流程在运行着,而在后台挂起状态的进程只能收到信号却不能产生中断并递达信号。
守护进程
守护进程有自己进程组和Session,不受用户登录注销影响。
往往在系统开启时自启动,系统关闭时终止,绝大部分服务器都是守护进程实现。
系统的1号进程init就是守护进程,父进程ID为0通常是内核进程,负责启动各层次的服务进程。
创建步骤
- 设置umask为0,守护进程创建的文件不受继承的权限影响
- fork,父进程exit,子进程继承父进程组ID,但是组长进程(父进程)已经退出了
- setsid,创建新会话,使调用的进程称为会话首进程
- 更改工作目录为 ,不继承原先的目录
- 关闭所有文件描述符