欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

用模板的方式创建守护进程代码实例

程序员文章站 2023-11-27 20:54:22
复制代码 代码如下:#include "wrap.h"#define mydomain_flag "/tmp/.mydomain_log" void domain_end...

复制代码 代码如下:

#include "wrap.h"
#define mydomain_flag "/tmp/.mydomain_log"

void domain_end(){
 unlink(mydomain_flag);
}

int domain_init(){
 int fd;
 fd=open(mydomain_flag,o_rdwr|o_creat|o_excl|o_append,0600);
 if(fd==-1)
  err_sys(errno,"domain faild, %s",mydomain_flag);
 dup2(fd,1);
 dup2(fd,2);
 return fd;
}
/*
功能:
 work函数为我们的工作函数,他的返回值,会被init()系统进程收集作为守护的退出码
参数:
 argc,argv均为入口函数main()的参数副本。
*/
int work(int argc,char **argv){
 while(1){
  sleep(60);
  err_msg("one loop....");
 }
 return 0;
}
int start_domain(int argc,char **argv,int (*work)(int argc,char **argv)){
 pid_t pid;
 int  fd,ecode;
 fd=domain_init();
 if(fork()==0){
  if(fork()==0){
   atexit(domain_end);
   err_msg("domain has ran sucessfully....");
   /*如果work()的返回时间比其父进程调用exit(0)的时间早,将不会被init()进程领养。以后我们会用管道的特点来同步父子进程。*/
   ecode=work(argc,argv);
   exit(ecode);
  }
  exit(0);
 }
 wait(null);
 return 0;
}
int main(int argc,char **argv){
 return start_domain(argc,argv,work);
}