我在使用Qt的linux中進行編碼。我知道使用popen或QProcess我可以從我的程序啓動終端,但我該如何寫入它?我谷歌周圍的人都建議叉()和管道()。 我的目的是用終端進行ICMP ping,並在ping成功時停止。我用popen做了,但是我無法停止ping程序,因此我的程序無法運行。在Qt中啓動並寫入終端
1
A
回答
1
你不會寫任何東西給終端,因爲沒有終端。您傳遞要運行的程序的名稱及其參數作爲QProcess::start
方法的參數。如果您只需要知道ping是否成功,那麼檢查您之前使用QProcess::start
開始的進程的退出代碼就足夠了;你不必讀取它的輸出。
如果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"
相關問題
- 1. 如何從QT程序中啓動終端中的bash腳本?
- 2. 連接終端並啓動docker組成?
- 3. 啓動MongoDB的,並返回到終端
- 4. 在java中寫入gnome終端
- 5. 在新終端中啓動Python腳本
- 6. 如何在終端中啓動命令,就好像我打開終端並輸入命令
- 7. QT可以打開一個Linux終端,然後寫入它嗎?
- 8. 寫入文件Linux終端
- 9. 從Java寫入終端
- 10. 從Matlab啓動Linux終端
- 11. 啓動GNOME終端12.04
- 12. 啓動雜種服務器在終端
- 13. 終端:shell啓動文件在哪裏?
- 14. 在Windows啓動R命令終端
- 15. 在終端啓動Sinatra保持空白
- 16. Golang寫入輸入並從終端進程獲得輸出
- 17. 如何在eclipse中啓動程序與在終端中啓動程序不同?
- 18. 任何幫助寫在終端上的命令行(mac-Qt)
- 19. Qt Creator未打開終端
- 20. 通過QT運行終端
- 21. Qt串行通訊終端
- 22. 無法在Docker快速入門終端中寫入
- 23. 如何避免始終在終端啓動時輸入id_rsa的密碼?
- 24. 自動輸入終端
- 25. .emacs編輯以始終在終端模式下啓動Emacs?
- 26. 使用終端或bash腳本創建並寫入.plist
- 27. 創建管道並從C++寫入gnuplot終端
- 28. qt GUI應用程序中的終端
- 29. 如何更換Qt Creator中的終端?
- 30. 點擊QT的.app VS在終端
感謝您的回答,這非常有幫助!但我不明白,我們是否必須將程序路徑或其他東西傳遞給QProcess :: start?你傳遞字符串「ping」,這是如何工作的? – Darren 2011-01-09 11:02:42