守护进程就是在后台运行,不与任何终端关联的进程。
通常情况下守护进程在系统启动时就在运行,它们以 root 用户或者其他特殊用户(apache 和 postfix)运行,并能处理一些系统级的任务。习惯上守护进程的名字通常以 d 结尾(sshd),但这些不是必须的。
我们在 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 命令,查看,如下:
此时,我们直接运行该二进制文件,输入以下命令:
./daemon
运行成功后,控制台输出如下:
此时,我们的程序就是守护进程了。