Złapać dekoduje stdout exec.Command

głosy
0

Próbuję złapać wyjście zewnętrznego programu. Przykład:

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

I tu jest moje 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)
    }
}

Problemem jest buforowanie standardowe wyjście. „Reecho” uzyskać dane tylko wtedy, kiedy 4096 bajtów w buforze stdout lub programu jest opuszczający (dla mojego krótkiego przykład). Czy istnieje sposób, aby zmniejszyć rozmiar bufora, aby złapać każdą linię wyjścia?

Aktualizacja: Same binarny „infcount” działa dobrze, gdy biegł z muszli. pisze, że każdy „i” na ekranie.

Utwórz 18/12/2018 o 11:11
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

wersja programu C, która będzie śledzić wyjścia jak to się dzieje

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

Jeśli jest wtedy istniejący Program skompilowany stdbufmoże być w stanie go naprawić, patrz https://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html

Odpowiedział 18/12/2018 o 15:45
źródło użytkownik

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