在Linux下创建守护进程的步骤如下:
(图片来源网络,侵删)
1、创建子进程,使用fork()函数,父进程中,fork()返回新创建子进程的进程ID;子进程中,fork()返回0。
2、在子进程中,调用setsid()创建新的会话,并成为会话组长。
3、改变当前工作目录,通常设置为根目录("/")。
4、重设文件权限掩码,通常设置为0。
5、关闭不需要的文件描述符,如标准输入、输出和错误输出。
6、在子进程中,再次创建子进程,使用fork()函数,这样做的目的是使守护进程失去终端的控制终端,使其摆脱原会话、进程组和控制终端的影响。
7、在第二个子进程中,继续执行守护进程的任务。
8、在第一个子进程中,退出,使守护进程完全脱离控制终端。
以下是一个简单的示例代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void daemonize() { pid_t pid; // 1. 创建子进程 pid = fork(); if (pid < 0) { perror("fork"); exit(EXIT_FAILURE); } else if (pid > 0) { // 父进程退出 exit(EXIT_SUCCESS); } // 2. 创建新的会话 if (setsid() < 0) { perror("setsid"); exit(EXIT_FAILURE); } // 3. 改变当前工作目录 if (chdir("/") < 0) { perror("chdir"); exit(EXIT_FAILURE); } // 4. 重设文件权限掩码 umask(0); // 5. 关闭不需要的文件描述符 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // 6. 再次创建子进程 pid = fork(); if (pid < 0) { perror("fork"); exit(EXIT_FAILURE); } else if (pid > 0) { // 第一个子进程退出 exit(EXIT_SUCCESS); } } int main() { daemonize(); // 在这里执行守护进程的任务 while (1) { sleep(1); } return 0; }
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/671370.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复