从deamon创建一个分叉的进程

时间:2017-08-27 22:05:57

标签: c++ linux fork

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

在启动新流程时是否有一些我缺少的东西?

这是我的代码

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);
}

1 个答案:

答案 0 :(得分: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,这更像是一种风格,并没有改变功能。