C++ fork() 和 execl() 调用 (Linux) 后无法识别命令
C++ Command not recognized after fork() and execl() call (Linux)
我正在尝试创建一个可以打开终端浏览器并浏览网站的程序。在调用子进程之前,它工作正常。显示以下错误
"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);
使用两个参数 xdotool
和 xdoCMD.c_str()
调用 xdotool
程序作为第二个参数。
您应该将xdoCMD.c_str()
分成几部分。从中构建一个适当的(NULL
终止的!(char*
数组,然后调用 execvp(3(。
实际上,您应该模仿外壳的功能。也许你甚至可能想要通配(但你需要决定你想要什么样的扩展;也许要注意代码注入(。参见 glob(7(。
不要忘记检查故障(fork
,execvp
等...
顺便说一句,gdb
调试器(不要忘记用g++ -Wall -g
编译(和 strace(1( 都有助于找到这样的错误。
相关文章:
- GCC-7:错误:无法识别的命令行选项"-M64"
- 'cmake'不被识别为内部或外部命令 - 北极星
- 如何从核心转储文件中识别导致崩溃的完整命令
- C++ fork() 和 execl() 调用 (Linux) 后无法识别命令
- exe文件不被识别为内部或外部命令,可操作的程序或批处理文件在C++
- 在 Windows 7 中编译C++代码(无法识别"g++"命令)
- 错误:生成Mesos中无法识别的命令行选项"-Wno无效源编码"[-Weror]
- gcc:错误:在 MacOSX 上构建 openjdk9 时'-mstack-alignment=16'无法识别的命令行选项
- 无法识别的命令行选项 '-WI'
- G-WAN cc1plus:错误:无法识别的命令行选项"-std=gnu++0x"
- getopt:不识别有效的命令行参数
- 针对有限数量的命令的快速语音识别
- 命令在复制/粘贴时未识别,但在手动编写时标识
- Netbeans 7.2 中 c++ "-std=c++11"无法识别的命令行选项
- php未被识别为内部或外部命令
- MinGW:错误:无法识别的命令行选项"-V"
- cc1plus:错误:使用 HXCPP "-stdlib=libstdc++"无法识别的命令行选项
- Scons 选择哪个版本的 g++ |无法识别的命令行选项"-std=c++11"
- VS2012:"nmake"未被识别为内部或外部命令
- CImg 错误:"gm.exe"未被识别为内部或外部命令,