1

ping コマンドの出力を保存したい。どこが間違っているのか教えてください。

let [res, pid, stdin, stdout, stderr] = GLib.spawn_async_with_pipes(null, ["ping","-c","1",host], null, GLib.SpawnFlags.SEARCH_PATH, null);
GLib.io_add_watch(stdout, GLib.IOCondition.IN, this._read, stdout);

アップデート

これが問題のステートメントに追加されるため、私の返信の1つからこれを引用します。

実際には、Javascript を使用して Cinnamon Desktop (Linux Mint 16) 用のアプレットを作成したいと考えています。このアプレットは、ホストに ping を実行し、平均 ping 時間をパネルにラベルとして表示します。だから私は GLib.spawn_async_with_pipes を使って同じことをしていました。ですから、これを案内してください。

4

1 に答える 1

2

これは Glibmm の例です。Python に簡単に変換できるはずです。

int child_pid;
int child_stdout;
Glib::spawn_async_with_pipes("", std::vector<std::string>{"ping", "192.168.1.1"}, Glib::SPAWN_SEARCH_PATH|Glib::SPAWN_STDERR_TO_DEV_NULL, sigc::slot<void>(), &child_pid, nullptr, &child_stdout);

Glib::RefPtr<Glib::IOChannel> ch_out = Glib::IOChannel::create_from_fd(child_stdout);
Glib::RefPtr<Glib::IOSource> src_out = ch_out->create_watch(Glib::IO_IN);
src_out->connect([ch_out](Glib::IOCondition cond){ return handle_stdout(cond, ch_out); });
src_out->attach(Glib::MainContext::get_default());


bool handle_stdout(Glib::IOCondition cond, Glib::RefPtr<Glib::IOChannel> ch) {
    Glib::ustring text;
    ch->read_line(text);
    textview->get_buffer()->insert(textview->get_buffer()->end(), text);
    return true;
}

編集:src_out->destroy()イベントループから削除するために、読み取りが完了したら呼び出す必要もあります。

于 2014-02-03T00:01:38.310 に答える