当前位置: > > > > 捕获 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 输出》的详细内容,更多关于的资料请关注公众号!