【问题标题】:How to timeout a vala Subprocess?如何使 vala 子进程超时?
【发布时间】:2020-06-04 16:36:17
【问题描述】:

我正在尝试在 GLib.Subprocess 中运行可执行文件并提取其结果。但是,它可能是一个无限循环并且永远不会结束。所以,我希望子进程在 1 秒后结束。这是我尝试过的:

string executable = "/path/to/executable";
string input = "some_input";
uint timeout_id = 0;
...
...
try {
    string output_string;
    var subp = new GLib.Subprocess.newv ({executable}, SubprocessFlags.STDIN_PIPE | SubprocessFlags.STDOUT_PIPE);
    timeout_id = GLib.Timeout.add (1, () => {
        subp.force_exit ();
        source_remove ();
        return false;
    });
    subp.communicate_utf8 (input, null, out output_string, null);
} catch (GLib.Error e) {
    print ("Error: %s\n", e.message);
}
...
...
void source_remove () {
    if (timeout_id > 0) {
        Source.remove (timeout_id);
        timeout_id = 0;
    }
}

我也尝试过使用{"timeout", "1", executable},但如果可执行文件是无限循环,它不会停止。

【问题讨论】:

    标签: timeout gtk glib vala


    【解决方案1】:

    问题出在这一行:

        subp.communicate_utf8 (input, null, out output_string, null);
    

    您正在使用同步 GSubProcess.communicate_utf8() 调用,该调用将阻塞直到进程终止。由于您的超时回调也在主循环中被调用(这意味着同一个线程),所以它也不会被调用。为防止这种情况,您应该使用异步变体GSubProcess.communicate_utf8_async()

    注意:您不需要在超时回调中调用source_remove():GSource 将通过返回 false 自动删除。

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2011-04-13
      • 1970-01-01
      相关资源
      最近更新 更多