2015-10-06 98 views
0

我一直在這個問題的最後五個小時bussy,所以我希望有人可以幫助我。在我的C++程序中(我在Lubuntu的QTcreator中開發)我想在程序的子進程中運行airodump-ng。 airodump-ng的輸出應該指向父處理器的標準輸出。這與許多其他程序一起工作,但不夠airodump-ng。控制檯中根本沒有輸出。這個,或者我的Linux崩潰,我退出,當我重新登錄我的所有程序時,都會關閉。有人知道爲什麼嗎?execl在兒童過程中僅適用於特定情況

#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而不是隻exit ING。

現在的怪事:

第一fork?你爲什麼這樣做?你基本上是fork s和exit是孩子的馬上。再次讓你fork,並讓父母wait - 這應該觸發第一個孩子立即終止的事實。

pipe,你爲什麼要這樣做,如果你不想保持標準?相反,你可以在管道的寫入結束處使用標準err,但是你似乎沒有對讀取結束做任何事情。