代潇瑞博客

linux下守护进程概念及用C语言实现示例

| 点击次数:8011

守护进程即我们平时所说的后台进程,它不占据终端,不受用户登陆注销的影响。


1、特点

  (1) 后台服务进程。

  (2) 独立于控制终端,终端名设置为?号。

  (3) 周期性执行某任务。

  (4) 不受用户登陆注销的影响。

  (5) 一般采用以d结尾的名字(服务),比如:mysqld。


2、创建守护进程的步骤

  (1)fork子进程,父进程退出(必须)

  (2)子进程创建新会话(必须,setsid())

  (3)改变当前工作目录chdir(非必须,建议做)

    防止:插入了一个U盘,a.out,在U盘目录中启动,运行过程中,U盘拔掉了。

  (4)重设子进程掩码(非必须)

    增加子进程程序操作的灵活性(umask(0))。

  (5)关闭文件描述符(非必须)

    为了释放资源。

  (6)执行核心工作(必须,非必须就没有意义了)


3、C语言代码实现

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

int main(int argc, char *argv[])
{
    pid_t pid = fork();
    if (pid > 0) {
        exit(1); // 1.父进程退出
    } else if (pid == 0) {
        // 2.变为会长,脱离了控制终端
        setsid();
        // 3.改变进程的工作目录
        chdir("/~");
        // 4. 重置文件掩码
        umask(0);
        // 5. 关闭文件描述符
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
        // 6. 执行核心操作
        int fd = open("/root/temp-deamon-log.txt", O_CREAT | O_WRONLY | O_APPEND, 0664);
        int i;
        for (i = 0; i < 100; i++) {
            sleep(3);
            time_t curtime;
            time(&curtime);
            char* pt = ctime(&curtime);
            write(fd, pt, strlen(pt) + 1);
        }
        close(fd);
    }

    return EXIT_SUCCESS;
}


4、守护进程和nohup

(1) 从nohup源码就可以看到,其实nohup只做了3件事情

  dofile函数将输出重定向到nohup.out文件。

  signal函数设置SIGHUP信号处理函数为SIG_IGN宏(指向sigignore函数),以此忽略SIG_HUP信号。

  execvp函数用新的程序替换当前进程的代码段、数据段、堆段和栈段。

  execvp 函数执行后,新程序(并没有fork进程)会继承一些调用进程属性,比如:进程id、会话id,控制终端等。


(2) 在终端关闭后,nohup起到类似守护进程的效果,但是跟传统的守护进程还是有区别的

  nohup创建的进程工作目录是你执行命令时所在的目录。

  0 1 2 标准输入 标准输出 标准错误  指向nohup.out文件。

  nohup创建的进程组中,除首长进程的父进程id变为1之外,其余进程依然保留原来的会话id、进程组id、父进程id,都保持不变。


【相关推荐】

触屏版 | 电脑版

Copyright © 2013 代潇瑞博客手机版

QQ: 446673330

粤ICP备13071969号-1