Trave saída stdout tamponada de exec.Command

votos
0

Estou tentando pegar saída do programa externo. Exemplo:

#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;
}

E aqui é o meu 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)
    }
}

O problema é o buffer de saída padrão. Reedição obter dados somente quando 4096 bytes na memória temporária ou programa stdout está saindo (para o meu pequeno exemplo). Existe uma maneira de diminuir o tamanho do buffer para pegar cada linha de saída?

Update: mesmo binário 'infcount' funciona bem quando corria de shell. Ele grava todos os 'i' para a tela.

Publicado 18/12/2018 em 11:11
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

versão do seu programa C que irá acompanhar a saída como acontece

   #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;
    }

Se é um programa pré-compilado existente, em seguida, stdbufpode ser capaz de corrigi-lo, ver https://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html

Respondeu 18/12/2018 em 15:45
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more