子进程中的Execl仅在特定情况下工作



我已经为这个问题忙了五个小时了,所以我希望有人能帮助我。在我的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 ?你为什么这么做?基本上,你马上就能得到forkexit。您再次执行fork,并让父进程执行wait——这将触发第一个子进程立即终止的事实。

pipe,如果你不想把标准排除在外,你为什么要这样做?相反,您的dup标准错误到管道的写端,但您似乎没有对读端做任何事情。

相关内容

  • 没有找到相关文章

最新更新