【问题标题】:Writing a Daemon Process Debug Log编写守护进程调试日志
【发布时间】:2011-02-22 16:00:32
【问题描述】:

所以我开始进行一些操作系统/进程编程等,我是新手,但我基本上已经弄清楚了,(我的大学操作系统书没用,所以我不得不浏览万维网......是的我只是这么称呼它)

无论如何,这是我的守护进程框架......它大部分不是我的,基本上是从书籍示例代码中四处寻找的点点滴滴(对吗?)

无论如何,我对会话 ID 有一些疑问(它到底是什么?它与进程 ID 有什么区别)

和 2 是我将如何记录调试文件?在下面的部分?因为它不在守护程序循环中?我们会返回诸如“守护进程开始:上午 11:59”之类的内容吗?

3,我们究竟为什么要更改目录?以及你为什么希望它是 root ......显然我不是一个 x-pert linux 程序员但仍然......

我想我不明白这如何使它成为一个守护进程?我了解分叉和父母/孩子......但是是什么让它成为守护进程?

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

int main(void) {
        //Process and Session ID 
        pid_t pid, sid;

        //Fork
        pid = fork();
        if (pid < 0) {
                exit(EXIT_FAILURE);
        }
        //Huzzah
        if (pid > 0) {
                exit(EXIT_SUCCESS);
        }

        /* Change the file mode mask */
        umask(0);

       /* APPARENTLY I PLACE LOGFILES HERE? HOW? */       

        //Create new sid (i don't understand this
        sid = setsid();
        if (sid < 0) {
                exit(EXIT_FAILURE);
        }



        //Change Directory, Why?
        if ((chdir("/")) < 0) {
                exit(EXIT_FAILURE);
        }

        /* Close out the standard file descriptors <---Why? just for protection */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        /* Daemon-specific initialization goes here */

        //Daemon Loop
        while (1) {
          //Do Task
        }
   exit(EXIT_SUCCESS);
}

编辑:忘了说这是针对 Linux 的

【问题讨论】:

标签: c linux process daemon


【解决方案1】:

最后一个问题首先:除了在后台运行且不受用户控制之外,没有严格定义将进程视为守护进程的条件。但是守护进程通常有很多特征,其中一些你已经掌握了。 This 是一个简单的英文起点。

进程组和会话本身就是一个主题。 This 是一个足够好的起点。

我不知道您对日志文件问题的确切了解。由于与终端 stdin/out/err 解除关联的守护程序被重定向或关闭。这就留下了将输出发送到哪里的问题,在这种情况下是错误消息。通常使用 Syslog(或类似)工具,但没有什么可以阻止您使用您选择的任何旧文件。您可能想在事件循环之外打开它们,但那里没有其他神奇的事情发生 - 您只需写信给它们。

工作目录已更改,因为您永远不知道程序启动时初始目录将是什么。它可能是一个网络驱动器(或其他),可以在您的(长期运行的)守护程序仍在运行时被卸载。您可以将目录更改为您想要的任何目录,但通常使用root,因为如果根目录消失得很好......

如果您发现自己对这些东西越来越认真,那么请买一本好的Stevens 书,可能以APUE 开头。它们价格昂贵,但却是一生中最好的投资之一。

【讨论】: