用execv从c++中启动一个服务

Launching a service from c++ with execv

本文关键字:一个 服务 启动 execv c++      更新时间:2023-10-16

我正在尝试从c++启动linux服务,我成功地做到了,但我的一个进程被标记为"defunct",我不希望我的父进程死亡。

我的代码是(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),
                 "runningn");
            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个进程,其中一个被标记为失效?我的代码有什么问题?我该怎么修理它?

要删除僵尸,父进程必须将其子进程wait()或死亡。如果你需要一个非阻塞的wait(),看看W_NOHANG标志的waitpid()

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

我强烈建议使用其他程序中经过良好调试的实现——一个功能较弱的命令行shell(如rsh或ksh)可能是一个不错的选择,而不是尝试编写自己的版本。