Команда 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) полезны для поиска такой ошибки.