func (f *File) Fd() uintptr {
if f == nil {
return ^(uintptr(0))
}
// If we put the file descriptor into nonblocking mode,
// then set it to blocking mode before we return it,
// because historically we have always returned a descriptor
// opened in blocking mode. The File will continue to work,
// but any blocking operation will tie up a thread.
if f.nonblock {
f.pfd.SetBlocking()
}
return uintptr(f.pfd.Sysfd)
}
1条答案
按热度按时间zkure5ic1#
靶病变; DR:
在使用
os.File.Fd()
后对文件使用syscall.SetNonblock(fd.Fd(), true)
这是由于
read
in golang UNIX的实现:如果文件被设置为阻塞模式,则第一个
n, err := ignoringEINTRIO(syscall.Read, fd.Sysfd, p)
将永远阻塞。waitRead
仅在文件以非阻塞模式打开时执行。但是我确实以非阻塞模式打开了文件,那么发生了什么?os.File.Fd()
broke it的实现:Fd()
总是将文件设置为阻塞。因此,我们必须在等待轮询读取之前撤消此操作。因此:在使用
os.File.Fd()
后对文件使用syscall.SetNonblock(fd.Fd(), true)