当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 守护进程
守护进程
时间:2016-12-14作者:华清远见

文章的开始,我们先来了解一下什么是守护进程。

在linux中,每一个系统与用户进行交流的界面称为终端。从该终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端。当控制终端被关闭时,相应的进程都会被自动关闭。

守护进程能够突破这种限制,它从开始运行,直到整个系统关闭才会退出。如果想让某个进程不会因为用户或终端变化而受到影响,就必须把这个进程变成一个守护进程。那么如何创建一个守护进程呢,看下面的步骤:

一、守护进程的编写步骤:

1、创建子进程,父进程退出
        2、在子进程中创建新会话
        3、改变当前目录为根目录
        4、重设文件权限掩码
        5、关闭文件描述符

每一步的作用与意义:

1、第一步完成以后,由于父进程已经先于子进程退出,子进程变成了孤儿进程,由init进程收养,在形式上做到了与控制终端的脱离。

相关代码:
        pid = fork();
        if (pid > 0) /*父进程退出*/
        {
                exit(0);
        }

2、第二步的作用是使进程能够完全独立出来,真正地做到脱离所有其他进程的控制,这里需要用到函数setsid();

setsid函数用于创建一个新会话,并使得当前进程称为新会话组的组长。

3、在进程运行过程中,当前目录所在的文件系统是不能卸载的,所以要用到第三步,将进程当前的工作目录修改一下,变成不可卸载的目录(“/”或”/tmp”),用到函数chdir。

4、第四步重设文件权限掩码,文件权限掩码是指文件权限中被屏蔽掉的对应位。把文件权限掩码设置为0,可以增加守护进程的灵活性。用到的函数为umask。

5、新建的子进程会从父进程那里继承所有已经打开的文件。在创建完新的会话后,守护进程应该脱离任何控制终端,应当关闭用不到的文件。这时候要用到函数getdtablesize,该函数的作用是获得文件描述符表的大小,由于咱们不知道从父进程那里继承了哪些文件描述符,所以就干脆都关一遍。(除了0,1,2)

相关代码:
        fdtablesize = getdtablesize();
        for (fd = 3; fd < fdtablesize; fd++)
        close(fd);

经过上面的5步,守护进程就创建成功了,它脱离了终端的控制。

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)