0

我正在尝试创建一个可以打开终端浏览器并浏览网站的程序。在调用子进程之前它工作正常。出现以下错误

“xdotool:未知命令:搜索 --onlyvisible --name 终端窗口激活 keydown Down”

我已经在一个单独的终端中测试了该命令,它确实有效,但在我的代码中没有得到识别。我觉得这可能与 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);
}
} 
4

1 回答 1

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)

实际上,您应该模仿 shell 的功能。也许您甚至可能想要通配(但您需要决定您想要什么样的扩展;也许要小心代码注入)。参见glob(7)

不要忘记检查失败(forkexecvp...)

顺便说一句,gdb调试器(不要忘记用 编译 g++ -Wall -gstrace(1)都有助于找到这样的错误。

于 2018-04-10T05:55:35.073 回答