Команда C++ не распознается после вызова fork() и execl() (Linux)

Я пытаюсь создать программу, которая может открывать браузер терминала и перемещаться по веб-сайту. Работает до тех пор, пока не будет вызван дочерний процесс. Следующая ошибка обнаруживается

"xdotool: Неизвестная команда: поиск --onlyvisible --name Окно терминала активировать ключ вниз"

Я проверил команду в отдельном терминале, и она действительно работает, но она не распознается в моем коде. У меня такое ощущение, что это может быть связано с тем фактом, что execl не возвращается обратно в main, но я новичок в программировании, поэтому не знаю наверняка.

Вот код

#include <iostream>
#include <string>
#include <unistd.h>

using namespace std;

int main(int argc, char *argv[]) {

string thread;
cout << "website: ";
cin >> thread;

const char* xdo = "xdotool";
pid_t pid = fork();
string strThread = "" + thread;
string xdoCMD = " search --onlyvisible --name Terminal windowactivate keydown Down";

if (pid < 0) {
cout << "Process failed" << endl;
return 1;
} 
else if (pid == 0) {
execl("/usr/bin/xdotool", "xdotool", xdoCMD.c_str(), (char *) NULL);
}

else {
//  sleep(1);
execl("/usr/bin/elinks", "elinks", strThread.c_str(), (char *) NULL);
}
} 

1 ответ

Решение

execl(3) вызывает execve (2) (чьи аргументы входят в main выполненной программы). Они возвращаются только в случае неудачи.

Так

execl("/usr/bin/xdotool", "xdotool", xdoCMD.c_str(), (char *) NULL);

зовет xdotool программа с двумя аргументами, xdotool а также xdoCMD.c_str() -в качестве единственного второго аргумента.

Вы должны разделить xdoCMD.c_str() на несколько частей. Построить соответствующий (NULL прекращено!) массив char* затем вызовите execvp(3).

По сути, вы должны имитировать, что делает оболочка. Возможно, вы даже захотите использовать глобализацию (но вам нужно решить, какие расширения вы хотите; возможно, остерегайтесь внедрения кода). Смотрите глоб (7).

Не забудьте проверить на неудачу (из fork, execvp так далее...)

Кстати, оба gdb отладчик (не забудьте скомпилировать с g++ -Wall -g) и strace(1) полезны для поиска такой ошибки.

Другие вопросы по тегам