2-26 守护进程程序设计

来源:互联网 发布:手机怎么差评淘宝网店 编辑:程序博客网 时间:2024/06/06 13:58

(本节笔记的实验代码,在这里)

1.  基本概念

    守护进程,也就是daemon(精灵)进程,是Linux中的一种服务进程。守护进程具有以下特点:

        1.1  不占用控制终端,守护进程都在后台运行。([root]#./app &)

        1.2  独立于控制终端。一般进程有对应的TTY(如PTS/8),但守护进程没有对应的控制终端,ps aux命令查看守护进程对应的TTY显示“?”(如下图smbd进程)

        1.3  周期性运行。

 

2.  守护进程设计要素

        2.1后台运行

        守护进程不占用任何一个控制终端,实现方法是调用通过创建子进程来充当守护进程,而父进程退出,子进程在后台运行的方式。

    pid = fork()

    if(pid > 0)

        exit(0);

    else(pid == 0)

    {

        /* 子进程为守护进程 */

    }

                                                                    』

        2.2独立于控制终端

        守护进程脱离控制终端。

        /* 脱离控制终端,不与任意TTY关联 */

        setsid();       /*<unistd.h> */

        2.3脱离父进程的影响(继承了父进程的一些因素)

            2.3.1修改工作目录

                进程活动时,其工作目录所在的文件系统不能卸载。在守护进程被创建时,会继承父进程的工作目录,因此需要将守护进程的工作目录切换到根目录。

                      chdir("/");    /* <unistd.h> */

 

             2.3.2修改文件权限掩码

                     文件权限掩码是指屏蔽文件权限中的对应位(如掩码“500”会屏蔽文件创建者的可读可执行权限),在守护进程被创建时,会继承父进程的文件权限掩码,影响子进程中新创建的文件的访问权限。因此,需要重新对子进程中的权限掩码清零。

    umask(0);       /* <sys/types.h>    <sys/stat.h> */

 

        2.3.3  关闭打开文件

        守护进程被创建时,会继承父进程一些打开的文件,这些文件被打开会一直消耗系统资源,因此子进程被创建时应把这些文件关闭。

    for(i= 0; i < MAXFILE; i++)

        close(i);

 

3.  综合实例

/*  touch daemon.c  */


    #include<stdio.h>

    #include <stdlib.h>

    #include<string.h>

    #include<sys/types.h>

    #include<sys/stat.h>

    #include<fcntl.h>

    #include<unistd.h>

 

    int main()

    {

        int i;

        int fd;

        int flag = 1;

        char buff[64] = "sleep 10seconds!\n";

        /* 1.创建子进程作为守护进程 */

        pid_t pid;

        pid = fork();

        if(0 > pid)

        {

            printf("Createprocess fail!\n");

            exit(1);

        }

        if(0 < pid)

            exit(0);

        /* 2.守护进程脱离控制终端 */

        setsid();

        /* 3.守护进程工作目录更改到根目录 */

        chdir("/");

        /* 4.对文件权限掩码清零 */

        umask(0);

        /* 5.关闭文件 */

        for(i = 0; i < 65535; i++)

        {

            close(i);

        }

        /* 6.在文件里周期性地写入数据 */

        while(1)

        {

            if(1 == flag)

            {

                if(-1 ==(fd = open("/arm/150707_daemon/sleep.log", O_RDWR | O_CREAT, 0777)))

                {

                    printf("Createfile fail!\n");

                    exit(1);

            }

                flag = 0;

            }

            write(fd,buff, strlen(buff));

            sleep(10);

        }

    close(fd);

    return 0;

}

0 0
原创粉丝点击