1

我正在尝试从 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 个进程,其中一个被标记为已失效?我的代码有什么问题?我该如何解决?

提前致谢。

4

2 回答 2

1

要删除僵尸,您的父进程必须wait()是其子进程或死亡。如果您需要使用标志进行非阻塞wait()查看。waitpid()W_NOHANG

于 2014-05-07T15:11:02.237 回答
0

在 Unix 和 Linux 中正确地分叉一个守护进程是很困难的,因为有很多细节要正确,而且顺序也很重要。在这种情况下,我怀疑是打开文件描述符的组合而不是分离控制终端。

我强烈建议从另一个程序中使用经过良好调试的实现 - 功能减少的命令行 shell 之一(如 rsh 或 ksh)可能是一个不错的选择,而不是尝试烘焙自己的版本。

于 2014-05-07T17:42:22.940 回答