当前位置: > > > > 捕获 exec.Command 的缓冲 stdout 输出
捕获 exec.Command 的缓冲 stdout 输出
来源:stackoverflow
2024-04-23 22:27:33
0浏览
收藏
本篇文章给大家分享《捕获 exec.Command 的缓冲 stdout 输出》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。
问题内容
我正在尝试捕获外部程序的输出。示例:
#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:
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)
}
}
问题是标准输出的缓冲。 “reecho”仅在标准输出缓冲区中的 4096 字节或程序退出时获取数据(对于我的简短示例)。有没有办法减少缓冲区的大小以捕获每一行输出?
更新:从 shell 运行时,相同的二进制“infcount”工作正常。它将每个“i”写入屏幕。
解决方案
将在发生时跟踪输出的 c 程序版本
#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 可能能够修复它,请参阅
以上就是《捕获 exec.Command 的缓冲 stdout 输出》的详细内容,更多关于的资料请关注米云公众号!
