我正在尝试创建一个可以打开终端浏览器并浏览网站的程序。在调用子进程之前,它工作正常。出现以下错误
“xdotool:未知命令:search --onlyvisible --name Terminal windowactivate 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);
}
}
最佳答案
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 的作用。也许你甚至想要 globbing (但你需要决定你想要什么样的 expansions ;也许要小心 code injection )。参见 glob(7) .
不要忘记检查失败(fork
、execvp
等...)
顺便说一句,gdb
debugger (不要忘记编译 with g++ -Wall -g
)和 strace(1)有助于找到这样的错误。
关于fork() 和 execl() 调用后无法识别 C++ 命令 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49746195/