【发布时间】:2015-11-17 00:47:18
【问题描述】:
我无法在 Go (1.5) 中获得管道状态。
在mkfifo 创建的管道上写入时,我尝试获取此输出管道的状态:
- 使用
Write返回状态EPIPE - 在 SIGPIPE 上使用
Write返回状态EPIPE和signal.Ignore(以防万一) - 在 SIGPIPE 上使用
signal.Notify
我可以看到:
-
EPIPE永不返回 - 当我使用
kill -13时,调用信号处理程序:“得到信号:损坏的管道” - 当我
ctrl-c阅读器时,不会调用信号处理程序,并且我的程序退出并输出:“信号:损坏的管道”
请指出我的错误吗?
// tee.go
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
sys "golang.org/x/sys/unix"
)
// wait for a signal and print it
func handleSignal(csig chan os.Signal) {
for {
fmt.Println("Wait signal")
s := <-csig
fmt.Println("Got signal:", s)
}
}
func main() {
csig := make(chan os.Signal, 1)
// `kill -13` outputs "Got signal: broken pipe" => ok
signal.Notify(csig, sys.SIGPIPE)
// OR disable the previous `Notify` just to be sure ?
// maybe it will help to get the EPIPE error status on `Write` ?
//signal.Ignore(sys.SIGPIPE)
go handleSignal(csig)
// open previously created named pipe (`mkfifo /tmp/test`)
pipe, _ := os.OpenFile("/tmp/test", os.O_WRONLY, 0)
for {
_, err := pipe.Write([]byte("foo\n"))
if err == syscall.EPIPE {
// never called => ko
fmt.Println("EPIPE error")
}
}
}
注意:作为一个简单的 Go 练习,我尝试实现一个几乎类似于 tee -a <a_file> 的命令(将 stdin 打印到 stdout 和 <a_file>),具有以下特性:non blocking write on a named pipe and optional reader。
【问题讨论】: