守护进程

守护进程教程

守护进程就是在后台运行,不与任何终端关联的进程。

通常情况下守护进程在系统启动时就在运行,它们以 root 用户或者其他特殊用户(apache 和 postfix)运行,并能处理一些系统级的任务。习惯上守护进程的名字通常以 d 结尾(sshd),但这些不是必须的。

创建守护进程的步骤

  • 调用 fork(),创建新进程,它会是将来的守护进程。
  • 在父进程中调用 exit,保证子进程不是进程组长。
  • 调用 setsid() 创建新的会话区。
  • 将当前目录改成跟目录(如果把当前目录作为守护进程的目录,当前目录不能被卸载他作为守护进程的工作目录)。
  • 将标准输入,标注输出,标准错误重定向到 /dev/null。

案例

创建守护进程

我们在 Linux 下使用 vim 新建一个 daemon.c 的文件,编写如下 C 语言 代码如下:

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <errno.h> #include <signal.h> #include <fcntl.h> #include <unistd.h> #include <linux/fs.h> int main(void) { pid_t pid; int i; pid = fork(); //创建一个新进程,将来会是守护进程 if(pid == -1) { return -1; } else if(pid != 0) { //父进程调用exit,保证子进程不是进程组长 exit(EXIT_SUCCESS); } if(setsid() == -1) //创建新的会话区 { return -1; } if(chdir("/") == -1) //将当前目录改成根目录 { return -1; } for(i = 0;i < 1024;i++) { close(i); } open("/dev/null",O_RDWR); //重定向 dup(0); dup(0); return 0; }

我们使用 gcc 编译上述程序,具体命令如下:

gcc daemon.c -odaemon

编译完成后,会在当前目录生成一个 daemon 的二进制可执行文件,我们使用 ls 命令,查看,如下:

08_守护进程.png

此时,我们直接运行该二进制文件,输入以下命令:

./daemon

运行成功后,控制台输出如下:

09_守护进程.png

此时,我们的程序就是守护进程了。