程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一個守護進程實例

一個守護進程實例

編輯:關於C語言

void DaemonInit(void)
{

//LOG::INF("[ServerMeeting] 服務初始化.\n");
int pid;

//如果是父進程,結束父進程,子進程繼續
if(pid=fork())
{
  exit(0);
}
/*else if(pid<0) // 不可能進入
{
  exit(1); //fork失敗,退出
}*/

//是第一子進程,後台繼續執行
setsid();//第一子進程成為新的會話組長和進程組長

//並與控制終端分離
if(pid=fork())
{
  exit(0);//是第一子進程,結束第一子進程
}
/*else if(pid<0)
{
  exit(1);//fork失敗,退出
}*/

//關閉打開的文件描述符,保留標准輸入(0),標准輸出(1)和標准錯誤輸出(2)
//還可以將這3文件通過dup2重定向:error=open("/tmp/error",O_WRONLY|O_CREAT, 0600); dup2(error,2); close(error); //in=open("/tmp/in",O_RDONLY|O_CREAT,0600); if(dup2(in,0)==-1) perror("in"); close(in); //out=open("/tmp/out",O_WRONLY|O_CREAT,0600);if(dup2(out,1)==-1) perror("out"); close(out);
for(int fd=3,fdtablesize=getdtablesize();fd <fdtablesize;fd++)
{

close(fd);

}

//重設文件創建掩模
umask(0);

//信號處理
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP ,SIG_IGN);
signal(SIGTERM,SIG_IGN);

//設置系統參數
struct rlimit l = {0,0};
l.rlim_cur=65535;
l.rlim_max=65535;
setrlimit(RLIMIT_NOFILE,&l);

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved