Fangen gepufferte stdout Ausgang exec.Command

stimmen
0

Ich versuche Ausgang des externen Programms zu fangen. Beispiel:

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

Und hier ist mein 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)
    }
}

Das Problem ist, Puffern von stdout. „Reecho“ Daten nur erhalten, wenn 4096 Bytes in stdout Puffern oder ein Programm (für mein kurzes Beispiel) zu verlassen. Gibt es Art und Weise Größe des Puffers zu verringern jede Zeile der Ausgabe zu fangen?

Update: Samen binär ‚infcount‘ funktioniert gut, wenn von Shell lief. Es schreibt jedes ‚i‘ auf dem Bildschirm.

Veröffentlicht am 18/12/2018 um 11:11
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Version Ihres C-Programm, das die Ausgabe wird verfolgen, wie es geschieht

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

Wenn es ein vorhandenes vorkompilierte Programm ist dann , stdbufes zu beheben möglicherweise in der Lage, siehe https://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html

Beantwortet am 18/12/2018 um 15:45
quelle vom benutzer

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