Go 访问星号EAGI的FD(3)

Go 访问星号EAGI的FD(3),go,asterisk,Go,Asterisk,我有下面的Golang代码,它似乎是无限期阻塞的 eagi := os.NewFile(uintptr(3), "/dev/stdeagi") data := bufio.NewReaderSize(eagi, 64*1024) ... data.WriteTo(conn) // Blocks indefinitely! 它甚至没有抛出一个错误-我的猜测是,我没有正确地访问FD。我的目的是访问流程的FD 3以供使用。我还尝试了阅读替代路径fmt.Sprintf(“/proc/%d/fd/3”,

我有下面的Golang代码,它似乎是无限期阻塞的

eagi := os.NewFile(uintptr(3), "/dev/stdeagi")
data := bufio.NewReaderSize(eagi, 64*1024)
...
data.WriteTo(conn) // Blocks indefinitely!

它甚至没有抛出一个错误-我的猜测是,我没有正确地访问FD。我的目的是访问流程的FD 3以供使用。我还尝试了阅读替代路径
fmt.Sprintf(“/proc/%d/fd/3”,os.Getpid())
,但这似乎表现出相同的方式。我做错了什么?

正确的方法是
syscall.Read(fd int,buf[]字节)(n int,err error)
()。关于我的问题,从Asterisk控制台内部,调用
sip show channelstats
表明我没有完全接收RTP数据包,并且读取被阻塞,因为实际上没有什么可读取的内容。我的网络设置需要工作。

您确定有文件描述符3吗?你试过打开文件吗?@JimB当我在Docker容器中执行
ls/proc//fd
时,我看到一个
3
。当我尝试
cat
它时,我得到了
拒绝的许可
@Flimzy我用它作为灵感,而Go似乎就是这么用的?@Angad:据我所知,你的代码应该会无限期地阻塞。在fd 3关闭之前不会返回。它通过连接发送了什么吗?你有没有尝试过分步读写,看看你是否取得了进展?@JimB-Hmm-会给标准的读/写方法一个机会,但如果我没记错的话,WriteTo只会耗尽缓冲区,即它是内部读/写调用的组合。因此,它应该多次写入缓冲区,直到遇到io.EOF