c++ - 使用 execv 从 C++ 启动服务

标签 c++ linux service daemon execv

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

提前致谢。

最佳答案

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

关于c++ - 使用 execv 从 C++ 启动服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23521274/

相关文章:

c++ - 如何从一个数组中提取零并将非零部分保存到另一个数组?

c++ - 双缓冲 waveOutWrite() 像 hell 一样口吃

linux - 我无法在 centos 7 中打开 robo3t 1.1.1

android - 在android中无限运行服务

java - Tomcat 停止问题 + Spring boot + 服务

c++ - 包含在头文件中与前向声明并包含在 .cpp 中

c++ - 打包 BCD 的 Wireshark 解析器编码

php - 为什么我在使用 Zend Framework 1 发送电子邮件时收到 500 内部服务器错误?

Android JNI,如何使用soname libxx.so.1.2.3加载库

php - 在 linux 上用 php 检查服务状态?