Команда 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);
}
}

0

Решение

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) Полезно найти такую ​​ошибку.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]