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

C++ Command not recognized after fork() and execl() call (Linux)

本文关键字:识别 命令 调用 fork execl C++ Linux      更新时间:2023-10-16

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

"xdotool:未知命令:搜索 --仅可见 --名称终端窗口激活键关闭">

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

使用两个参数 xdotoolxdoCMD.c_str() 调用 xdotool 程序作为第二个参数。

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

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

不要忘记检查故障(forkexecvp等...

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