execlp执行后挂起

时间:2015-04-22 15:08:44

标签: c++ fork pid webots

我在cpp程序中调用外部二进制文件(Webots Simulator),调用fork()execlp(),它接受​​一个特定文件路径的参数。当文件的路径有效且文件存在时没有问题,但是,当我将其指向无效文件时,我得到了预期的Could not open file: 'file.wbt' ,但子进程没有退出。我虽然可能是由于Webot的内部代码以及它如何处理这些错误,但是,如果我在系统的bash shell上调用webots file.wbt,则会抛出相同的错误但是进程结束它应该

我的计划的可编辑部分:

#include <iostream>
#include <fstream>
#include <stdio.h>

#include <sys/types.h>
#include <signal.h>

int start_webots(const char* world){
    //starting webots as a child process with known PID
    int pid = fork();
    if (pid == 0){
        printf("Starting Webots...");
        execlp("/usr/bin/webots","webots",world,NULL);
        printf("Finished executing Webots");
        exit(1);
    }
    else printf("Webots PID: %i\n", pid);
    return pid;
}

int main(int argc, char const *argv[]){
    int pid=start_webots("/home/joao/Work/ASBG/code/cpp/darwin/worlds/darwin_cpgs_noise.webt");

    if (kill(pid,0)) printf("NO PROCESS RUNNING\n");
    return 0;
}

只要二进制文件存在(安装了webots),execlp之后的代码行自然不会执行,因为webots会替换子进程。但是,在错误Could not open (...)之后我没有获得stdout的任何输出,程序会挂起,我会在后台运行进程webots

我究竟做错了什么/如何找到解决方法或解决方案?

0 个答案:

没有答案