Linux--进程间关系与守护进程

一:进程间关系:

1.进程组:

  • 进程组就是一个或多个进程的集合,进程组中会有一个组长进程,每个进程组有唯一的进程组ID,进程组ID与组长进程ID相同。
    注:某个进程组只要有一个进程存在,该进程组就存在,与其组长进程是否存在没有关系。
    这里写图片描述
  • 这里的PGID就是进程组ID, ./a.out &可以将其放在后台运行

2.作业

  • 作业也是一个或者多个进程的集合,但是它与进程组的概念有点不同,如果进程组中的进程创建子进程,那么子进程还属于该进程组;但是如果作业中的某个进程创建子进程,那么该子进程就不属于该作业;
  • shell分前后台控制的不是进程而是作业,shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。一旦前台作业运行结束,shell就把自己提到前台。
    jobs :查看后台作业
    fg + 作业号:将后台作业提到前台
    这里写图片描述
    注:这里ctrl + c可以结束一个前台作业,不是进程

3.会话

  • 会话是一个或多个进程组的集合。每一次会话都至少有一个前台作业和任意多个后台作业并且得有一个控制终端与之关联,该会话中与终端关联的进程叫话首进程,通常话首进程由bash承担。杀掉话首进程并不是结束了该会话。
    注:登陆一个终端是创建一个会话的过程,注销是删除会话的过程。
    这里写图片描述
  • 这里的SID就是会话ID,三个进程都属于同一个进程组,组ID5599,组长ID5599,那会话5457是谁呢?
    这里写图片描述
  • 就是bash(shell就叫bash),bash是该会话中的话首进程。

4.与作业控制有关的信号

  • 后台作业禁止从终端读取数据,因为后台作业可能有多个,不知道将数据给谁。所以将cat放到后台运行后,由于需要读标准输入(终端输入),因此内核发SIGTTIN信号给cat进程,该信号的默认处理动作是使进程停止。
    ctrl + z :将一个正在运行的前台作业暂停放到后台
    bg + 作业号 :让一个暂停的后台作业运行起来

二:守护进程

1.基本概念

  • 守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。他独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。守护进程不受用户登录注销的影响。
    注:大部分守护进程本身就是孤儿进程,自成进程组,子程会话。
    这里写图片描述
  • 这里凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。

2.创建守护进程

  • 系统接口:
    int daemon(int nochdir, int noclose); //第一个参数表示是否改变工作目录,第二个参数表示是否关闭文件。0表示是,1表示否。

  • 实现mydaemon
    这里写图片描述

  • 运行后发现确实成为守护进程
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/virgofarm/article/details/80661902