LINUX守护进程


int Daemon(char* szExecName = NULL)
{
 int res = 0;
 pid_t pc;
 pc = fork();
 if(pc < 0)
 {
  fprintf(stderr,"ERROR_Deamon()_fork(): failed!");
  return -1;
 }
 else if(pc == 0) //sub process
 {
 }
 else if(pc > 0)  //parent process
 {
  fprintf(stderr,"parent process exit!/n");
  sleep(2);
  exit(0);
 }

 res = setsid();
 if(res == -1)
 {
  fprintf(stderr,"ERROR_Deamon()_setsid(): errno = %d/n", errno);
  return -1;
 }

 if(pc=fork())
  exit(0);//是第一子进程,结束第一子进程
 else if(pc< 0)
  exit(1);//fork失败,退出
 //是第二子进程,继续
 //第二子进程不再是会话组长

 // for maybe its path is not current path when run.
 char szModulePath[MAX_PATH] = {0};
 GetModuleFileName(szExecName, szModulePath, sizeof(szModulePath));
 res = chdir(szModulePath);
 if(res == -1)
 {
  fprintf(stderr,"ERROR_Deamon()_chdir(): path = %s, errno = %d/n", szModulePath, errno);
  return -1;
 }
 umask(0);
 //for(int i = 0; i < MAXFILE; i++)
// {
  //close(i);
 //}

 return 0;
}Dstlen)
  *szTmp = '/0';
 return i;
}



1.获取程序运行的绝对路径
int GetModuleFileName(char* sModuleName, char* sModulePath, int nSize)
{
 int ret = -1;
 char* p = getenv("_");
 if(p != NULL && strstr(p, sModuleName) != NULL)
 {
  realpath(p, sModulePath);
  char* p = strrchr(sModulePath, '/');
  p[1] = '/0';

  ret = 0;
 }
 else
 {
  realpath(sModuleName, sModulePath);
  char* p = strrchr(sModuleP/');
  p[1] = '/0';

  ret = 0;
 }

 return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值