捕获exec.Command的缓冲stdout输出 [英] Catch buffered stdout output of exec.Command

查看:81
本文介绍了捕获exec.Command的缓冲stdout输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试捕获外部程序的输出.示例:

I'm trying to catch output of external program. Example:

#include <stdio.h>
#include <unistd.h>
#include <stddef.h>

int main() {

    int i = 0;

    while(i < 10) {
        printf("i = %i\n", i++);
        usleep(2000000);
    }
    return 0;
}

这是我的main.go:

And here is my main.go:

package main

import (
    "bufio"
    "io"
    "log"
    "os/exec"
)

func reecho(closer io.ReadCloser)  {
    reader := bufio.NewReader(closer)

    for {
        s, e := reader.ReadString('\n')
        if e != nil {
            log.Println(e)
            break
        }
        log.Println(s)
    }
}

func main() {
    cmd := exec.Command("./infcount")
    log.Println("starting ", cmd)
    stdout, err := cmd.StdoutPipe()
    stderr, _ := cmd.StderrPipe()

    if err != nil {
        log.Fatal(err)
    }
    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }

    go reecho(stdout)
    go reecho(stderr)

    if err := cmd.Wait(); err != nil {
        log.Fatal(err)
    }
}

问题是标准输出的缓冲.仅当stdout缓冲区或程序中的4096字节退出时,"reecho"才获取数据(对于我的简短示例).有没有办法减小缓冲区的大小以捕获每一行输出?

The problem is buffering of stdout. "reecho" get data only when 4096 bytes in stdout buffer or program is exiting(for my short example). Is there way to decrease size of buffer to catch every line of output?

更新:从shell运行时,相同的二进制"infcount"工作正常.它将每个"i"写入屏幕.

Update: Same binary 'infcount' works fine when ran from shell. It writes every 'i' to the screen.

推荐答案

您的C程序的版本,该版本将在发生输出时进行跟踪

version of your C program that will track the output as it happens

   #include <stdio.h>
    #include <unistd.h>
    #include <stddef.h>

    int main() {

        int i = 0;

        while(i < 10) {
            printf("i = %i\n", i++);
            usleep(2000000);
            fflush(stdout);
        }
        return 0;
    }

如果它是现有的预编译程序,则 stdbuf 可以修复它,请参见

If it is an existing precompiled program then stdbuf may be able to fix it, see https://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html

这篇关于捕获exec.Command的缓冲stdout输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆