我正在尝试从c ++启动一个Linux服务并且我成功地完成了它,但是我的一个进程被标记为“已经不存在”,我不希望我的父进程死掉。
我的代码是(testRip.cpp):
int main()
{
char* zebraArg[2];
zebraArg[0] = (char *)"zebra";
zebraArg[1] = (char *)"restart";
char* ripdArg[2];
ripdArg[0] = (char *)"ripd";
ripdArg[1] = (char *)"restart";
pid_t ripPid;
pid_t zebraPid;
zebraPid = fork();
if(zebraPid == 0)
{
int32_t iExecvRes = 0;
iExecvRes = execv("/etc/init.d/zebra", zebraArg);
return 0;
if(iExecvRes == -1)
{
::syslog((LOG_LOCAL0 | LOG_ERR),
"zebra process failed \n");
}
}
else
{
while(1)
{
::syslog((LOG_LOCAL0 | LOG_ERR),
"running\n");
sleep(2);
}
}
}
ps -e命令的退出是:
9411 pts/1 00:00:00 testRip
9412 pts/1 00:00:00 testRip <defunct>
9433 ? 00:00:00 zebra
/etc/init.d/zebra将该服务作为守护进程或类似的东西启动,所以我认为这是诀窍但是:
为什么有3个进程,其中一个被标记为已失效? 我的代码有什么问题? 我该如何解决?
提前致谢。
答案 0 :(得分:1)
要移除僵尸,您的父进程必须wait()
其子级或死亡。如果您需要使用wait()
标记waitpid()
进行非阻止W_NOHANG
。
答案 1 :(得分:0)
在Unix和Linux中正确分配守护程序进程很难,因为有很多细节可以正确完成,顺序也很重要。在这种情况下,我怀疑是打开文件描述符的组合而不是分离控制终端。
我强烈建议使用另一个程序中经过良好调试的实现 - 其中一个功能较少的命令行shell(如rsh或ksh)可能是一个不错的选择,而不是尝试烘焙自己的版本。