Я пытаюсь создать программу, которая может открывать браузер терминала и перемещаться по веб-сайту. Работает до тех пор, пока не будет вызван дочерний процесс. Следующая ошибка обнаруживается
«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);
}
}
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
) а также Трассирование (1) Полезно найти такую ошибку.
Других решений пока нет …