【发布时间】:2017-03-07 05:51:24
【问题描述】:
我正在尝试使用 cgo 来使用来自 golang 的 C 代码,但是在我的小 hello-world 测试中,我遇到了一些我无法理解或无法找到更多信息的东西。
我从一个类似于examples I've found的简单测试开始
package main
import (
"fmt"
"unsafe"
)
/*
#import <stdio.h>
#import <stdlib.h>
*/
import "C"
func main() {
go2c := "Printed from C.puts"
var cstr *C.char = C.CString(go2c)
defer C.free(unsafe.Pointer(cstr))
C.puts(cstr)
fmt.Printf("Printed from golang fmt\n")
}
这个简单的示例只是通过基本的cgo 绑定从 golang(使用 fmt.Printf)和原始 C(使用 C.puts)将字符串回显到标准输出。
当我直接在终端中运行它时,我会看到两行:
$ ./main
Printed from C.puts
Printed from golang fmt
当我运行这个但以任何方式 redirect 输出时——管道到less、shell 重定向到文件等——我只看到 golang 的输出:
./main | cat
Printed from golang fmt
管道/重定向时C.puts 内容会发生什么情况?
次要问题:这是一个 cgo 怪癖,还是我不知道的 c 标准库怪癖?这种行为是否记录在案?我将如何自行调试(例如,我是否有一种好的/合理的方法来“检查”每个块中的 FD1 到底是什么?)
更新:如果相关,我正在使用go version go1.6.2 darwin/amd64。
【问题讨论】: