所以我在一些操作系统/流程编程中开始这样,我是一个新手,但我已经大部分想通了,(我的大学操作系统书没用,所以我不得不浏览万维网......是的我只是称之为)
无论如何这是我的守护进程的骨架......它主要不是我的,基本上是从书本示例代码环顾四周拾取的碎片(是不是?)
无论如何,我对会话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的
答案 0 :(得分:1)
最后一个问题:除了在后台运行且没有用户控制之外,没有严格定义将进程限定为守护进程的内容。但是守护进程通常有一些特征,其中一些是您已经掌握的。 This是一个简单的英语起点。
流程组和会话本身就是一个主题。 This是一个不错的跳跃点。
我不知道您对日志文件问题的确切了解。由于守护进程与终端stdin / out / err解除关联,因此被重定向或关闭。这留下了输出输出的问题,在这种情况下是错误消息。通常使用Syslog(或类似的)设施,但没有什么能阻止您使用您选择的任何旧文件。你可能想要在事件循环之外打开它们,但是那里没有任何神奇的东西 - 你只需写信给它们。
工作目录已更改,因为您永远不知道程序启动时初始目录是什么。它可能是一个网络驱动器(或其他),可以在你的(长时间运行的)守护进程仍在进行时卸载。您可以将目录更改为您想要的任何目录,但通常使用root,因为如果根目录消失得很好......
如果你发现自己认真对待这些东西,那就找一本好的Stevens书,可能从APUE开始。它们价格昂贵,但却是一生中最好的投资之一。