Последние пять часов я был занят с этой проблемой, поэтому надеюсь, что кто-нибудь сможет мне помочь. В моей программе на 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();
}
В вашей программе есть несколько странностей. Но давайте начнем с вопроса — вы должны различать execl
не работает, и программа, которую вы пытаетесь выполнить, работает неправильно. Вы не должны иметь возможность аварийно завершить работу linux из пользовательской космической программы без специальных привилегий. Размещенный вами фрагмент кода не должен этого делать (что airpodump-ng
делает это другой вопрос).
Если execl
не сможет вернуться и установить errno
Предлагаю вам изучить это после execl
вместо просто exit
ING.
Теперь о странностях:
Первый fork
? Зачем ты это делаешь? Вы в основном fork
с и exit
ребенок сразу. Вы fork
снова и пусть родитель wait
— это должно спровоцировать тот факт, что первый ребенок закончился довольно быстро.
pipe
зачем вам это делать, если вы не хотите придерживаться стандарта? Вместо тебя dup
стандартная ошибка конца записи, но вы, похоже, ничего не делаете с концом чтения.
Других решений пока нет …