我已经为这个问题忙了五个小时了,所以我希望有人能帮助我。在我的c++程序中(我在lubuntu上的QTcreator中开发),我想在程序的子进程中运行airrodump -ng。airdump -ng的输出应该指向父进程的STDOUT。这适用于许多其他程序,但奇怪的是,它不适用于airrodump -ng。控制台中根本没有输出。或者我的Linux崩溃了,我被注销了,当我重新登录时,我所有的程序都关闭了。有人知道为什么吗?
#include <QCoreApplication>
#include <unistd.h>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <sys/wait.h>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//execl("/usr/sbin/airodump-ng", "airodump-ng", (char*)0 );
//dup2(1, 2); //pipe stderr to stdout
pid_t pidAirodump;
pid_t pidAircrack;
int pip[2];
if (pipe(pip) < 0) {
perror("allocating pipe for child input redirect");
return -1;
}
pidAirodump = fork();
if(pidAirodump > 0)//parent
{
pidAircrack = fork();
if(pidAircrack == 0)//pidAircrack
{
close(pip[0]);
dup2(pip[1], 2);
cout << "test" << endl;
//execl("/usr/sbin/arp", "arp", (char*)0 );
execl("/usr/sbin/airodump-ng", "airodump-ng ", "mon0", (char*)0 );
exit(0);
}
}
else//pidAirodump
{
exit(0);
}
wait(NULL);
return a.exec();
}
您的程序中有一些奇怪的地方。但是让我们从这个问题开始——你应该区分execl
不工作和你试图执行的程序行为不正常。如果没有特殊权限,您应该无法从用户空间程序使linux崩溃。你发布的代码片段不应该这样做(airpodump-ng
做什么是另一个问题)。
如果execl
失败,它将返回并设置errno
,我建议您在execl
之后检查,而不仅仅是exit
。
现在是奇怪的:
第一个fork
?你为什么这么做?基本上,你马上就能得到fork
和exit
。您再次执行fork
,并让父进程执行wait
——这将触发第一个子进程立即终止的事实。
pipe
,如果你不想把标准排除在外,你为什么要这样做?相反,您的dup
标准错误到管道的写端,但您似乎没有对读端做任何事情。