1

私はvalaを使用して、spawn_command_line_sync()でGLibを使用して外部アプリケーションを起動しようとしています。ドキュメント( http://valadoc.org/#!api=glib-2.0/GLib.Process.spawn_sync )によると、外部アプリケーションの出力を格納するための文字列を渡すことができます。

これは、数行を印刷するスクリプトを開始するときに正常に機能しますが、バイナリファイルの内容を印刷するプログラムを呼び出す必要があります。(たとえば、「cat / usr / bin / apt-get」)

文字列ではなく、DataStreamなどで外部プログラムの出力を受け取る方法はありますか?

外部プログラムの出力をファイルに書き込むことを計画しているので、「cat / usr / bin / apt-get> outputfile」を呼び出すだけで代替手段になりますが(それほど良くはありません)、うまくいかないようです。 。

とにかく、私はある種の出力ストリームを取得することを望みます。助けていただければ幸いです。

使用するコード:

using GLib;

static void main(string[] args) {
    string execute = "cat /usr/bin/apt-get";
    string output = "out";

    try {
        GLib.Process.spawn_command_line_sync(execute, out output);
    } catch (SpawnError e) {
        stderr.printf("spawn error!");
        stderr.printf(e.message);
    }

    stdout.printf("Output: %s\n", output);
}
4

2 に答える 2

2

GLib.Process.spawn_async_with_pipesを使用すると、まさにそれが可能になります。stdoutプロセスを生成し、、、、stderrおよびのそれぞれのファイル記述子を返しますstdinIOChannelValaDocには、出力を監視するようにsを設定する方法に関するコードのサンプルがあります。

于 2013-02-10T18:19:06.787 に答える
1

そのおかげで、文字列ではなくintを返すspawn_async_with_pipes()を読み過ぎたに違いありません。

このようにすることに何か問題がありますか?(バッファサイズ1以外)

using GLib;

static void main(string[] args) {

    string[] argv = {"cat", "/usr/bin/apt-get"};
    string[] envv = Environ.get();
    int child_pid;
    int child_stdin_fd;
    int child_stdout_fd;
    int child_stderr_fd;

    try {
        Process.spawn_async_with_pipes(
            ".",
            argv,
            envv,
            SpawnFlags.SEARCH_PATH,
            null,
            out child_pid,
            out child_stdin_fd,
            out child_stdout_fd,
            out child_stderr_fd);

    } catch (SpawnError e) {
        stderr.printf("spawn error!");
        stderr.printf(e.message);
        return;
    }

    FileStream filestream1 = FileStream.fdopen(child_stdout_fd, "r");
    FileStream filestream2 = FileStream.open("./stdout", "w");

    uint8 buf[1];
    size_t t;
    while ((t = filestream1.read(buf, 1)) != 0) {
        filestream2.write(buf, 1);
    }
}
于 2013-02-10T22:58:55.163 に答える