【Linux】守护进程及守护进程的创建

守护进程

       守护进程是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。
       守护进程没有控制终端。因此,说他们是在后台运行的。UNIX系统有很多守护进程,他们执行日常事务活动。
       下面我从守护进程结构,以及如何编写守护进程程序两个方面分析守护进程。

守护进程的特征

       我们使用ps -axj命令查看一些常用的系统守护进程。
【Linux】守护进程及守护进程的创建_第1张图片
       系统进程依赖于操作系统实现。

内核进程

       PPID = 0的各进程通常是内核进程,他们作为系统引导装入过程的一部分而启动。
       内核进程是特殊的,通常存在于系统的整个生命周期中,他们以超级用户特权运行,无控制终端,无命令行。

       在上面的ps输出结果中,内核守护进程的名字出现在方括号中。

kthreadd是一个特殊的内核进程,他用来创建其他内核进程,所以kthreadd表现为其他内核进程的父进程。

init

       init是个例外,它是一个内核在引导装入时启动的用户层次的命令。
       init是一个系统守护进程,除了其他的工作,主要负责启动个运行层次特定的系统服务。
       大多数守护进程都以超级用户(root)特权运行。所有的守护进程都没有控制终端,其终端名设置为文豪。内核守护进程以无控制终端方式启动。用户层守护进程缺少控制终端可能时守护进程调用了setsid函数的结果。
       大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且时这些进程组和会话中的唯一进程。
用户层守护进程的父进程是init。

编程规则

  • 首先要调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0),有继承得来的文件模式创建屏蔽字可能会被设置为拒绝某些权限。如果守护进程要创建文件,那么他可能要设置特定的权限。
  • 调用fork,然后使父进程exit。这样做实现了
  • 1.如果守护进程是作为一条简单的shell命令启动的,那么父进程终止会让shell认为这条命令已经执行完毕。
  • 2.虽然子进程继承了父进程的进程组ID,但获得了一个新的进程ID,那么就保证了子进程不是一个进程组的组长进程。、
  • 3.调用setsid创建一个新回话。我们知道如果调用setsid函数的进程不是一个进程组的组长,则此函数创建一个新回话。并且:

    1)该进程变成新会话的会话首进程,此时,该进程是新会话中的唯一进程
    2)该进程成为一个新进程组的组长进程。新进程组ID是该调用进程的进程ID
    3)该进程没有控制终端,即使调用函数之前该进程有一个控制终端,现在这种关系也被切断。

        PS:在基于System V的系统中,可以调用两次fork函数达到以上目的,终止父进程,继续使用子进程中的守护进程,这就保证了该守护进程不是会话手进程,于是按照System V的规则,同样可以防止取得控制终端。

  • 4.将当前工作目录改为根目录。
  • 5.关闭不再需要的文件描述符。这是守护进程不再持有从其父进程继承来的任何文件描述符。

守护进程的创建

        下面我们来创建守护进程:
首先代码为:
【Linux】守护进程及守护进程的创建_第2张图片
接着我们进行代码的编译,执行。
然后再执行ps -axj | grep create命令找出create_daemon进程
得到:
这里写图片描述
可以看到,该进程的TTY为?,即守护进程已经被正确的创建了。

你可能感兴趣的:(Linux)