Я вызываю внешний бинарный файл (Webots Simulator) в моей программе cpp, позвонив fork()
а также execlp()
, который принимает аргумент, который является путем к определенному файлу. Нет проблем, когда путь к файлу действителен и файл существует, однако, когда я указываю на неверный файл, я получаю ожидаемый Could not open file: 'file.wbt'
но дочерний процесс не завершается. Я думаю, что это может быть связано с внутренним кодом Webot и тем, как он обрабатывает такие ошибки, однако, если я позвоню webots file.wbt
в системной оболочке bash выдается такая же ошибка но процесс заканчивается как надо.
Компилируемый раздел моей программы:
#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;
}
Строки кода после execlp, естественно, никогда не выполняются до тех пор, пока существует двоичный файл (установлен веб-бот), поскольку веб-бот заменяет дочерний процесс. Однако после ошибки Could not open (...)
Я не получаю выход stdout
, программа зависает, и я получаю процессы webots
работает в фоновом режиме.
Что именно я делаю не так / как я могу найти обходной путь или решение?
Задача ещё не решена.