引言
在我自己开发的httpApi进程中,使用了守护进程,保证进程在意外退出的时候可以重新自动启动。但是使用pstree的时候发现创建了不止一个进程,其中代码和问题现象如下:
代码
int main(int argc, char *argv[])
{printMainVer();signal(SIGTTOU, SIG_IGN);signal(SIGTTIN, SIG_IGN);signal(SIGTSTP, SIG_IGN);if (0 != fork()) exit(0);if (-1 == setsid()) exit(0);signal(SIGHUP, SIG_IGN);while(1){if(0 == fork()){signal(SIGPIPE, SIG_IGN);for(;;){if(start_server() == false)debug_write_log("httpapi start is error\n");elsebreak;}for(;;)sleep(60);}elsewait(NULL);}}
问题

解决
猜测还是代码问题,修改代码如下:
if (0 != fork()) exit(0);
// printf("fatherid is %ld\n", (long) getpid());
if (-1 == setsid()) exit(0);pid_t child_pid = -1;
for (;;)
{if (child_pid == -1) // 只有在没有子进程时才创建新的子进程{child_pid = fork();if (child_pid == 0) // 子进程{signal(SIGPIPE, SIG_IGN);while (true){if (start_server() == false)debug_write_log("httpapi start is error\n");elsebreak;}for (;;)sleep(60);}else if (child_pid > 0) // 父进程{wait(NULL); // 等待子进程退出child_pid = -1; // 子进程退出后,更新child_pid为-1,准备下次创建子进程}else // fork失败{perror("fork failed");exit(EXIT_FAILURE);}}else // 已经有子进程在运行,父进程进入下一轮循环{wait(NULL); // 等待子进程退出child_pid = -1; // 子进程退出后,更新child_pid为-1,准备下次创建子进程}
}
发现还是无法解决,最后再仔细看了看pstree命令的功能,发现那些其实是线程,裂开: