Coger la salida stdout tamponada de exec.Command

votos
0

Estoy intentando coger la salida del programa externo. Ejemplo:

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

Y aquí es mi 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)
    }
}

El problema es el almacenamiento en búfer de salida estándar. Reecho obtener datos sólo cuando 4096 bytes en la memoria de la salida estándar o programa está saliendo (para mi corta ejemplo). ¿Hay manera de disminuir el tamaño del buffer a captar cada línea de salida?

Actualización: Igual 'infcount' binario funciona bien cuando se desarrolló entre la cáscara. Se escribe cada 'i' de la pantalla.

Publicado el 18/12/2018 a las 11:11
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

versión de su programa en C que hará un seguimiento de la salida como ocurre

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

Si se trata de un programa precompilado existente, entonces stdbufpuede ser capaz de solucionarlo, consulte https://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html

Respondida el 18/12/2018 a las 15:45
fuente por usuario

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