这里首先假设读者知道守护进程的大概概念,下面我们直接看程序。
//****************
环境,OS = Ubuntu 10.4 编译器 = gcc 4.5.2
******************//
int main(int argc, char **argv)
{
//因为下面要关掉某些信号,所以需要
struct sigaction sa;
int i, fd, fdtablesize;
//上来第一件事,调用umask将文件模式创建屏蔽字设置为0,为的是防止守护进程可能不具有对文件读写的权限
umask(0);
//设置信号处理函数,SIG_IGN为忽略信号
sa.sa_handler = SIG_IGN;
//sa.sa_mask这个成员的清零,一定要使用sigemtpy函数
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
//对以下几种信号做忽略处理
sigaction(SIGTTOU, &sa, NULL);
sigaction(SIGTTIN, &sa, NULL);
sigaction(SIGTSTP, &sa, NULL);
sigaction(SIGUP, &sa, NULL);
//关闭父进程,使子进程成为孤儿进程,从而被init收养
if(fork() != 0)
{
exit(1);
}
//创建一个新会话
if(setsid() < 0)
{
exit(1);
}
//第二次退出父进程
if(fork() != 0)
{
exit(1);
}
//改变工作路径到root,防止出现工作目录被卸载的情况
if(chidr("/") == -1)
{
exit(1);
}
//关闭打开的文件描述符,包括标准输入输出和标准出错
for(fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)
{
close(fd);
}
//再次关掉信号
sigaction(SIGCHLD, &sa, NULL);
//进入一个死循环让守护进程常驻内存
while(1)
{
//do somthing
sleep(1);
}
//至此就完成了对一个守护进程的初始化
return 0;
}