守护进程一

守护进程

什么是守护进程

守护进程是生存期长的一种进程。他们常在系统引导时装入,仅在系统关闭时才终止。因为他们没有控制终端,所以说他们是后台运行的。

如何创建守护进程

1.调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0).
2.调用fork(),然后使父进程exit。

1.如果该守护进程是作为shell命令启动的,可以让shell以为该命令已执行完毕
2.保证该进程不是一个进程组的组长进程

3.调用setsid创建一个新会话

1.成为新会话首进程
2.成为新进程组,组长进程
3.无控制终端

4.将当前目录更改为根目录
5.关闭不再需要的文件描述符
6.某些守护进程打开/dev/null/使其具有文件描述符,这样任何一个企图读标准输入,写标准输出,错误输出的都不会产生效果。
注:也可以在第三步后再次fork,终止父进程,保证该进程不是会话首进程

实例:

#include<apue.h>
#include<syslog.h>
#include<fcntl.h>
#include<sys/resource.h>
void demonize(const char *cmd)
{
	int i,fd0,fd1,fd2;
	pid_t pid;
	struct rlimit rl;
	struct sigaction sa;

	umask(0);    //设置文件创建屏蔽字
	if((pid=fork())<0)
	  err_quit("%s;can't fork",cmd);
	else if(pid!=0)
	  exit(0);        //父进程

	setsid();
	sa.sa_handler=SIG_IGN;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags=0;
	if(sigaction(SIGHUP,&sa,NULL)<0)
	  err_quit("%s:can't ignore SIGHUP",cmd);
	if((pid=fork())<0)
	  err_quit("%s,can't fork",cmd);
	else if(pid!=0)
	  exit(0);
	if(chdir("/")<0)
	  err_quit("%s,can't chdir",cmd);
	if(getrlimit(RLIMIT_NOFILE,&rl)<0)
	  err_quit("%s:can't get gile limit",cmd);
	if(rl.rlim_max==RLIM_INFINITY)
	  rl.rlim_max=1024;
	for(i=0;i<rl.rlim_max;i++)
	  close(i);

	fd0=open("/dev/null",O_RDWR);
	fd1=dup(0);
	fd2=dup(0);
}
int main()
{
   demonize("hello");
   sleep(60);
}

原文地址:https://www.cnblogs.com/battzion/p/4152225.html