1

Qtを使用してLinuxでコーディングしています。popen または QProcess を使用してプログラムからターミナルを起動できることは理解していますが、どのように書き込むのですか? 私は人々が fork() と pipe() を提案しているようにグーグルで検索しています。私の目的は、端末で ICMP ping を実行し、ping が成功したら停止することです。popen で作成したのですが、ping プロセスを停止できず、プログラムが実行されません。

4

1 に答える 1

1

ターミナルがないため、ターミナルには何も書き込みません。実行するプログラムの名前とその引数をメソッドの引数として渡しますQProcess::start。ping が成功したかどうかだけを知りたい場合は、 を使用して以前に開始したプロセスの終了コードを確認するだけで十分QProcess::startです。その出力を読む必要はありません。

ping(8)から- Linux man ページ

ping が応答パケットをまったく受信しない場合、コード 1 で終了します。パケット数と期限の両方が指定され、期限が到来するまでに受信したパケットが count より少ない場合も、コード 1 で終了します。他のエラーではコード 2 で終了します。それ以外の場合はコード 0 で終了します。これにより、終了コードを使用して、ホストが生きているかどうかを確認できます。

デフォルトpingでは、Linux では停止するまで実行されます。ただし、-c XX パケットのみを送信するオプションと-w X、プロセス全体のタイムアウトを X 秒に設定するオプションを使用できます。このようにして、ping の実行にかかる時間を制限できます。以下は、 Windows で ping プログラムを実行するため
の使用例です。QProcessLinux の場合は、それに応じて ping オプションを変更する必要があります (たとえば-n、 に-c)。この例では、ping は X 回まで実行されます。ここで、X はPingクラス コンストラクターに指定するオプションです。これらの実行のいずれかが終了コード 0 (成功を意味する) で戻るとすぐにresult、値 true でシグナルが発行されます。実行が成功しなかった場合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"
于 2011-01-07T22:05:16.403 に答える