我在我的程序中使用os.Pipes(),但由于某种原因,每次我尝试从中写入或读取数据时都会出现错误的文件描述符错误。
我做错了吗?
以下是代码
getGraphData("mydatabase");
function getGraphData(database) {
$.ajax({
url: "/wordpress/wp-admin/admin-ajax.php",
method: "POST",
data: { action: database },
success: function (response) {
//Some code;
}
})
}
输出: 写| 0:参数无效 读| 1:参数无效
答案 0 :(得分:4)
您使用的是os.Pipe
,它会从操作系统返回一对FIFO连接的文件。这与Go中实现的io.Pipe
不同。
invalid argument
错误是因为您正在读写错误的文件。 os.Pipe
的签名是
func Pipe() (r *File, w *File, err error)
表明返回值的顺序为"读者,作者,错误"。
和io.Pipe
:
func Pipe() (*PipeReader, *PipeWriter)
还按顺序返回"读者,作家"
当您从os.Pipe
功能检查错误时,您只打印该值。如果出现错误,则文件无效。您需要返回或退出该错误。
管道也在阻塞(虽然os.Pipe有一个小的硬编码缓冲区),所以你需要异步读写。如果您将其换成io.Pipe
,它会立即死锁。在goroutine中调度Read方法并等待它完成。
最后,您正在阅读nil
切片,它将不会读取任何内容。您需要分配空间来读入,并且需要记录读取的字节数以了解使用了多少缓冲区。
您示例的更正确版本如下:
reader, writer, err := os.Pipe()
if err != nil {
log.Fatal(err)
}
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
data := make([]byte, 1024)
n, err = reader.Read(data)
if n > 0 {
fmt.Println(string(data[:n]))
}
if err != nil && err != io.EOF {
fmt.Println(err)
}
}()
_, err = writer.Write([]byte("hello"))
if err != nil {
fmt.Println(err)
}
wg.Wait()