【发布时间】:2019-02-04 12:03:17
【问题描述】:
syscall write 返回 -1 并设置 errno 是一个小例子。如果 C write 调用返回零或正,我对 errno 的状态感兴趣。如果 errno 在任何情况下都不为零,则 Go 中的包装器 syscall.Write 仅返回 err,其中还包括 write 调用返回正数的情况。
但是,man page of C write call 大致描述了errno 可能如果我们写零长度缓冲区而不解释任何细节,也可以设置但未指定。
因此,以下情况似乎不清楚:
- 如果
write调用为文件、非阻塞套接字或阻塞套接字返回 0,errno的状态是什么? -
write何时以及如何调用返回 0 而errno不是 0? - 如果
write呼叫返回肯定,errno的状态是什么?会是负数吗? - 是否有任何其他系统调用可能遇到相同的情况?
我认为上面的描述指向了C write call 和Go syscall.Write 之间的区别,这对于开发人员来说是不清楚的,以下是我的想法:
根据手册页,在 C write 对文件和非阻塞套接字的调用中明确定义了返回零,但尚不清楚阻塞套接字是否存在会导致 @ 的非错误条件987654342@ 不阻塞,返回 0,并且(可能)稍后重试可能会成功。
Go 确实直接包装了系统调用write。但是,下面的代码 sn-p 似乎并不安全,因为written 等于零是可能触发err 但我们不想打破循环的情况:
func writeAll(fd int, buffer []byte) bool {
length := len(buffer)
for length > 0 {
written, err := syscall.Write(fd, buffer)
if err != nil { // here
return false
}
length -= written
buffer = buffer[written:]
}
return true
}
我的怀疑有什么不对吗?
【问题讨论】:
-
这里要注意的一点是,库函数永远不会重置/清除
errno- 这是调用者的责任。 -
@Antti:此外,在 Go 中,库函数根本不会触及 errno。
标签: c go system-calls