c++ - 从恶魔创建一个 fork 进程

标签 c++ linux fork

我想在 Linux 中创建一个需要终止另一个进程的守护进程。我已经创建了守护进程并且它工作正常,但是我的第二个进程已创建但它没有按预期运行。

在开始新流程时我是否遗漏了什么?

这是我的代码

void StartWSDevice()
{
    pid_t pid;
    int status;
    fflush(NULL);
    pid = fork();
    switch (pid) {
    case -1:
          perror("fork");
          break;
    case 0: {
        syslog(LOG_NOTICE, "WSDevice started.");
        int res = execl("home/pi/projects/WSDevice/bin/ARM/Debug",
                        "WSDevice.out", (char *)0);
        syslog(LOG_NOTICE, "WSDevice return %d.", res);
        break;
    }
    default:
        fflush(NULL);
        if (waitpid(pid, &status, 0) != -1) {
            syslog(LOG_NOTICE, "Child exited with status %i\n", status);
        } else {
            perror("waitpid");
        }
        break;
    }
}

int main(void) {
    deamonize();
    syslog(LOG_NOTICE, "WSDeviceService started.");
    while (!stopService) {
        // Check if my child process is running
        int pid_file = open("/var/run/WSDevice.pid",
                            O_CREAT | O_RDWR, 0666);
        int rc = flock(pid_file, LOCK_EX | LOCK_NB);
        if (rc) {
            if (EWOULDBLOCK == errno) {
            }
        } else {
            StartWSDevice();     // Its not running, start it
        }
        sleep(30); /* wait 30 seconds */
    }
    syslog(LOG_NOTICE, "WSDeviceService terminated.");
    exit(EXIT_SUCCESS);
}

最佳答案

您错误地使用了 execlexecl() 的第一个参数是要运行的进程。其余参数是传递给进程的 argv 数组的内容。这里的关键是 argv[0] 应该是正在运行的进程的名称。所以:

int res = execl("/home/pi/projects/WSDevice/bin/ARM/Debug/WSDevice.out",
                "/home/pi/projects/WSDevice/bin/ARM/Debug/WSDevice.out",
                NULL);

请注意,我还在 home 前面插入了 /。这对您来说可能很重要。我还使用了 NULL 而不是 (char *)0,这更像是一种风格,不会改变功能。

关于c++ - 从恶魔创建一个 fork 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909749/

相关文章:

c - 如何让 'fork()' ed child 共享标准输入?

linux - 没有 exec 的 fork,共享对象使用的 pthread_mutex_t

c++ - 如何识别为什么程序未在docker内部启动

linux - 什么包包括 AB Ubuntu 中的 Apache 服务器基准测试工具

r - 写入连接时出错 - 与 R 并行化 - Linux/Ubuntu 问题

linux - 为什么十六进制编辑不可逆?

C 信号处理错误,发出子父联系

c++ - C++中的类型和名称有什么区别?

c++ - 重载问题 C++

c++ - Getline 没有按预期工作