在编写服务程序时,需要在进程意外终止(crash)时,自动重启。
daemon进程
int main(int argc, char* argv[]){
do{
pid_t pid = fork();
if(pid<0){
// error
return 0;
}
if(pid>0{//parent进程,处于这个死循环中
int status;
pid_t p = wait(&status);// 等待子进程终止
}else{//子进程,退出while循环,开始服务
break;
}
} while(1);
// child process
// 开始做服务工作
....
}
上面代码就是个精简的daemon过程,主进程负责创建子进程,并在子进程终止时再次创建子进程。
在实际项目中,由于用到了golang封装的库,而golang对与用fork创建daemon存在问题(golang的协程,在子进程中存在问题)。
上面代码无法正常工作。需要在子进程中试用execl()重新加载程序,可通过参数来控制子进程不进入这个whiel循环。