我在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
。
我究竟做错了什么/如何找到解决方法或解决方案?