Linux作业控制(前后台)和守护进程

进程间的关系有哪些

之前学过父进程通过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通常是内核进程,负责启动各层次的服务进程。

创建步骤

  1. 设置umask为0,守护进程创建的文件不受继承的权限影响
  2. fork,父进程exit,子进程继承父进程组ID,但是组长进程(父进程)已经退出了
  3. setsid,创建新会话,使调用的进程称为会话首进程
  4. 更改工作目录为 ,不继承原先的目录
  5. 关闭所有文件描述符

猜你喜欢

转载自blog.csdn.net/hanzheng6602/article/details/80824910