1、任何一个进程都可以将自己实现成一个守护进程 2、create_daemon函数要素 (1)、子进程要等待父进程退出 (2)、子进程使用setsid创建新的会话期,脱离控制台 (3)、调用chdir将当前工作目录设置为/ (4)、umask设置为0以取消任何文件权限屏蔽 (5)、关闭所有文件描述符 (6)、将进程0、1、2定位到/dev/null #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void creat_daemon(void);
int main(void)
{
creat_daemon();
while()
{
printf(" i am running\n");
sleep();
}
return 0;
} void creat_daemon(void)
{
pid_t pid =0;
pid = fork();
if(pid < 0)
{
perror("fork");
exit(-1);
}
if(pid > 0)
{
exit(0); //父进程直接退出
}
//能够执行到到这里的就是子进程了
//setsid将当前进程设置为一个新的会话期session,
//目的就是让当前进程脱离控制台
pid = setsid();
if(pid < 0)
{
perror("setsid");
exit(-1);
}
//将当前进程工作目录设置为根目录
chdir("/");
//umask设置为0确保将来进程有最大的文件操作权限
umask(0);
//关闭所有文件描述符
//先要获取当前系统中所允许打开的最大文件描述符数目
int cnt = sysconf(_SC_OPEN_MAX);
int i = 0;
for(i = 0; i < cnt; i++)
{
close(i);
}
open("/dev/null", O_RDWR);//打开进程0,将其定位到/dev/null
open("/dev/null", O_RDWR);//打开进程1,将其定位到/dev/null
open("/dev/null", O_RDWR);//打开进程2,将其定位到/dev/null
}
|