使用io.Pipes()发送和接收消息

时间:2016-12-21 13:24:25

标签: go

我在我的程序中使用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:参数无效

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()