【问题标题】:execl in child process works for only in specific cases子进程中的 execl 仅适用于特定情况
【发布时间】:2015-10-06 08:23:33
【问题描述】:

过去五个小时我一直忙于解决这个问题,所以我希望有人能帮助我。在我的 C++ 程序(我在 lubuntu 上的 QTcreator 中开发)中,我想在我的程序的子进程中运行 airodump-ng。 airodump-ng 的输出应定向到父进程的 STDOUT。这适用于许多其他程序,但奇怪的是不适用于 airodump-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();
}

【问题讨论】:

    标签: c++ bash pipe fork execl


    【解决方案1】:

    您的程序中有一些奇怪之处。但让我们从这个问题开始——您应该区分execl 不工作和您尝试执行的程序行为不端。如果没有特殊权限,您应该无法从用户空间程序中使 linux 崩溃。您发布的代码 sn-p 不应该这样做(airpodump-ng 所做的是另一个问题)。

    如果execl 失败,它将返回并设置errno,我建议您在execl 之后检查它,而不仅仅是exiting。

    现在是奇怪的事情:

    第一个fork?你为什么这样做?你基本上是forks 和exits 孩子。你再次fork 并让父母wait - 这应该触发第一个孩子已经立即终止的事实。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 2021-12-28
      • 2021-05-16
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多