execl в дочернем процессе работает только в определенных случаях

Последние пять часов я был занят с этой проблемой, поэтому надеюсь, что кто-нибудь сможет мне помочь. В моей программе на C ++ (которую я разрабатываю в QTcreator на lubuntu) я хочу запустить 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();
}

0

Решение

В вашей программе есть несколько странностей. Но давайте начнем с вопроса — вы должны различать execl не работает, и программа, которую вы пытаетесь выполнить, работает неправильно. Вы не должны иметь возможность аварийно завершить работу linux из пользовательской космической программы без специальных привилегий. Размещенный вами фрагмент кода не должен этого делать (что airpodump-ng делает это другой вопрос).

Если execl не сможет вернуться и установить errnoПредлагаю вам изучить это после execl вместо просто exitING.

Теперь о странностях:

Первый fork? Зачем ты это делаешь? Вы в основном forkс и exitребенок сразу. Вы fork снова и пусть родитель wait — это должно спровоцировать тот факт, что первый ребенок закончился довольно быстро.

pipeзачем вам это делать, если вы не хотите придерживаться стандарта? Вместо тебя dup стандартная ошибка конца записи, но вы, похоже, ничего не делаете с концом чтения.

0

Другие решения

Других решений пока нет …