【问题标题】:Create a forked process from a deamon从恶魔创建一个分叉的进程
【发布时间】:2017-08-27 22:05:56
【问题描述】:

我想在 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);
}

【问题讨论】:

    标签: c++ linux fork


    【解决方案1】:

    您错误地使用了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,这更像是一种风格,不会改变功能。

    【讨论】:

    • 按它的名字,我也猜想Debug 是一个目录,而不是二进制文件,这将是execl 的另一个错误用法。
    • WSDevice.out 是二进制文件,Debug 是目录是的
    • @Jaques:我已经更新了我的答案以说明您的新信息。
    • 如果argv[0] 是正在运行的进程,那么argv[1] 是一个参数吗?因此,如果我不想传递任何参数,我可以将其留空吗?
    • 如果你不想传递任何参数,那么就按照我在回答中写的去做。 execl 始终需要参数列表末尾的NULL
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2021-05-31
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多