1,创建子进程,父进程退出
pid = fork();
if (pid >0)
...{
exit(0);
}
if (pid >0)
...{
exit(0);
}
2. 在子进程中创建新会话
使用setsid
主要是使进程摆脱原会话的控制,摆脱原进程组的控制,摆脱原控制终端的控制。
3.改变当前目录为根目录
使用fork创建的子进程继承了父进程的当前工作目录,由于进程运行过程中,当前目录所在的文件系统(比如/mnt/usb等)是不能卸载的,这对以后使用会造成很多不便,比如系统由于某种原因需要进入单用户模式)因此,通常将“/”做为守护进程的当前工作目录 使用chdir
4.重新设置文件权限演码
umask(0)
5.关闭文件描述符
for (i=0; i<MAXFILE;i++){
close(i);
}
详细代码
/**//**
* @file: daemon.c
* @brief: daemon
* @author: wangbing
* @date: 2007-11-9
* @version: 1.0
*/
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <errno.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/time.h>
int daemon_start(void)
...{
int i;
pid_t pid;
if( (pid = fork()) < 0)
...{
return(-1);
}
else if (pid!=0)
...{
exit(0);
}
setsid();
chdir("/");
umask(0):
for (i=0; i<MAXFILE; i++)
...{
close(i);
}
return 0;
}
* @file: daemon.c
* @brief: daemon
* @author: wangbing
* @date: 2007-11-9
* @version: 1.0
*/
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <errno.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/time.h>
int daemon_start(void)
...{
int i;
pid_t pid;
if( (pid = fork()) < 0)
...{
return(-1);
}
else if (pid!=0)
...{
exit(0);
}
setsid();
chdir("/");
umask(0):
for (i=0; i<MAXFILE; i++)
...{
close(i);
}
return 0;
}