2011-01-07 108 views
1

我在使用Qt的linux中進行編碼。我知道使用popen或QProcess我可以從我的程序啓動終端,但我該如何寫入它?我谷歌周圍的人都建議叉()和管道()。 我的目的是用終端進行ICMP ping,並在ping成功時停止。我用popen做了,但是我無法停止ping程序,因此我的程序無法運行。在Qt中啓動並寫入終端

回答

1

你不會寫任何東西給終端,因爲沒有終端。您傳遞要運行的程序的名稱及其參數作爲QProcess::start方法的參數。如果您只需要知道ping是否成功,那麼檢查您之前使用QProcess::start開始的進程的退出代碼就足夠了;你不必讀取它的輸出。

ping(8) - Linux man page

如果ping不得到任何回覆 包都將與代碼 1退出。如果同時指定了數據包數量和期限,少於計數 包收到 最後期限到達的時間,它也將 與代碼1退出。在其他錯誤,它 與代碼2退出。否則它退出 與代碼0.這使得有可能 使用退出代碼來查看是否一個主機是 還活着 或不。

默認情況下,Linux下的ping會一直運行,直到您停止爲止。但是,您可以使用-c X選項僅發送X個數據包,並使用-w X選項將整個過程的超時設置爲X秒。這樣你可以限制ping運行的時間。
下面是使用QProcess在Windows上運行ping程序的一個工作示例。對於Linux,您必須相應地更改ping選項(例如-n-c)。在這個例子中,ping運行X次,其中X是您給Ping類構造函數的選項。只要這些執行中的任何一個返回退出碼0(意味着成功),result信號就會以真值發出。如果沒有執行成功,result信號發出的值爲false。

#include <QCoreApplication> 
#include <QObject> 
#include <QProcess> 
#include <QTimer> 
#include <QDebug> 


class Ping : public QObject { 

    Q_OBJECT 

public: 

    Ping(int count) 
    : QObject(), count_(count) { 

     arguments_ << "-n" << "1" << "example.com"; 

     QObject::connect(&process_, 
         SIGNAL(finished(int, QProcess::ExitStatus)), 
         this, 
         SLOT(handlePingOutput(int, QProcess::ExitStatus))); 
    }; 

public slots: 

    void handlePingOutput(int exitCode, QProcess::ExitStatus exitStatus) { 
     qDebug() << exitCode; 
     qDebug() << exitStatus; 
     qDebug() << static_cast<QIODevice*>(QObject::sender())->readAll(); 
     if (!exitCode) { 
      emit result(true); 
     } else { 
      if (--count_) { 
       QTimer::singleShot(1000, this, SLOT(ping())); 
      } else { 
       emit result(false); 
      } 
     } 
    } 

    void ping() { 
     process_.start("ping", arguments_); 
    } 

signals: 

    void result(bool res); 

private: 

    QProcess process_; 
    QStringList arguments_; 
    int count_; 
}; 


class Test : public QObject { 

    Q_OBJECT 

public: 
    Test() : QObject() {}; 

public slots: 
    void handle(bool result) { 
     if (result) 
      qDebug() << "Ping suceeded"; 
     else 
      qDebug() << "Ping failed"; 
    } 
}; 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 

    Test test; 
    Ping ping(3); 
    QObject::connect(&ping, 
        SIGNAL(result(bool)), 
        &test, 
        SLOT(handle(bool))); 

    ping.ping(); 
    app.exec(); 
} 

#include "main.moc" 
+0

感謝您的回答,這非常有幫助!但我不明白,我們是否必須將程序路徑或其他東西傳遞給QProcess :: start?你傳遞字符串「ping」,這是如何工作的? – Darren 2011-01-09 11:02:42