我无法在 Go (1.5) 中获得管道状态。
在mkfifo
创建的管道上写入时,我尝试获取此输出管道的状态:
使用Write
退货状态EPIPE
使用Write
返回状态EPIPE
和signal.Ignore
SIGPIPE(以防万一)
signal.Notify
在 SIGPIPE 上使用
我知道:
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>)
犯罪嫌疑人X
相关分类