fork() 和 execl() 调用后无法识别 C++ 命令 (Linux)

标签 c++ linux exec xdotool

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

“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 程序,xdotoolxdoCMD.c_str() - 作为一个单个 第二个参数。

您应该将 xdoCMD.c_str() 分成几个部分。从中构建一个适当的(NULL 终止!)char* 数组,然后调用 execvp(3)

实际上,您应该模仿 shell 的作用。也许你甚至想要 globbing (但你需要决定你想要什么样的 expansions ;也许要小心 code injection )。参见 glob(7) .

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

顺便说一句,gdb debugger (不要忘记编译 with g++ -Wall -g)和 strace(1)有助于找到这样的错误。

关于fork() 和 execl() 调用后无法识别 C++ 命令 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49746195/

相关文章:

python - 我在使用 python 3 运行 os.execl() 时遇到问题

c++ - exec 如何改变执行程序的行为

c++ - 当 WM_MOUSELEAVE 有时不起作用时,如何知道鼠标何时离开我的窗口?

c++ - 为什么简单的迭代器不可读?

linux - 庆典 shell : grepping two strings in same line and use it in if-condition

linux - 两个变量比较,一到四种可能的输出

php - 如何使用来自 php 网页的 expect 脚本?

c++ - 防止构造函数参数隐式转换为外部库类型

c++ - 防火墙异常代码仅适用于传出连接

linux - 使用查找和 grep 的 Bash 脚本