实验:编写守护进程

分享到:
           

    1.实验目的

    通过编写一个完整的守护进程,掌握守护进程编写和调试的方法,进一步熟悉如何编写多进程程序

    2.实验内容

    在该实验中,首先创建一个子进程1(守护进程),然后在该子进程中新建一个子进程2,该子进程2暂停10s,然后自动退出,并由子进程1收集子线程退出的消息。在这里,子进程1和子进程2的消息都在系统日志文件(如“/var/log/messages”,日志文件的全路径名因Linux版本的不同可能会有所不同)中输出。在向日志文件写入消息后,守护进程(子进程1)循环暂停,其间隔时间为10s。

    3.实验步骤

    (1)画出该实验流程图。该程序流程图如图1所示。


图1 实验流程图

    (2)实验源代码。具体代码设置如下:

    /* daemon_proc.c */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <syslog.h>

    int main(void)
    {
        pid_t child1,child2;
        int i;

        /* 创建子进程1 */
        child1 = fork();
        if (child1 == 1)
        {
            perror("child1 fork");
            exit(1);
        }
        else if (child1 > 0)
        {
            exit(0); /* 父进程退出 */
        }
        /* 打开日志服务 */
        openlog("daemon_proc_info", LOG_PID, LOG_DAEMON);

        /* 以下几步是编写守护进程的常规步骤 */
        setsid();
        chdir("/");
        umask(0);
        for(i = 0; i < getdtablesize(); i++)
        {
            close(i);
        }

        /* 创建子进程2 */
        child2 = fork();
        if (child2 == 1)
        {
            perror("child2 fork");
            exit(1);
        }
        else if (child2 == 0)
        { /* 进程child2 */
            /* 在日志中写入字符串 */
            syslog(LOG_INFO, " child2 will sleep for 10s ");
            sleep(10);
            syslog(LOG_INFO, " child2 is going to exit! ");
            exit(0);
        }
        else
        { /* 进程child1 */
            waitpid(child2, NULL, 0);
            syslog(LOG_INFO, " child1 noticed that child2 has exited ");
            /* 关闭日志服务 */
            closelog();
            while(1)
            {
                sleep(10);
            }
        }
    }

    (3)由于有些嵌入式开发板没有syslog服务,读者可以在宿主机上编译运行,代码如下:

    $ gcc daemon_proc.c –o daemon_proc (或者使用Makefile)

    (4)运行该程序。

    (5)等待10s后,以root身份查看系统日志文件(如“/var/log/messages”)。

    (6)使用ps-ef | grep daemon_proc查看该守护进程是否在运行。

    4.实验结果

    (1)在系统日志文件中有类似如下的信息显示:

    Jul 20 21:15:08 localhost daemon_proc_info[4940]: child2 will sleep for 10s
    Jul 20 21:15:18 localhost daemon_proc_info[4940]: child2 is going to exit!
    Jul 20 21:15:18 localhost daemon_proc_info[4939]: child1 noticed that child2 has exited

    读者可以从时间戳里清楚地看到child2确实暂停了10s。

    (2)使用命令ps-ef | grep daemon_proc可看到如下结果:

    david    4939    1 0 21:15 ?    00:00:00 ./daemon_proc

    可见,daemon_proc确实一直在运行。

    本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》

   热点链接:

   1、Linux守护进程
   2、Linux下多进程编程之exec函数语法及使用实例
   3、Linux下多进程编程之fork()函数语法
   4、Linux下多进程编程之fork()函数说明
   5、Linux下进程的内存结构

更多新闻>>