我有一个C函数通过cgo调用Go例程。我需要Go例程来正确设置errno,这样C线程就可以检查它的错误并采取相应的行动。无法谷歌如何通过Go设置errno
答案 0 :(得分:3)
为了澄清一下,你仍然可以通过你通过cgo调用的C函数设置它。
package main
// #include <errno.h>
// #include <stdio.h>
//
// void setErrno(int err) {
// errno = err;
// }
//
import "C"
func main() {
C.setErrno(C.EACCES)
C.perror(C.CString("error detected"))
C.setErrno(C.EDOM)
C.perror(C.CString("error detected"))
C.setErrno(C.ERANGE)
C.perror(C.CString("error detected"))
}
在我的系统上输出
error detected: Permission denied
error detected: Numerical argument out of domain
error detected: Numerical result out of range
答案 1 :(得分:2)
您无法直接参考errno,请参阅cgo doesn't like errno on Linux。从那个线程:
我不知道什么是错的,但这并不重要,因为那不是一个问题。 无论如何安全使用errno。每次对C的调用都可能发生在 不同的OS线程,这意味着直接引用errno 不能保证得到你想要的价值。
从3880041开始尝试引用C.errno
会引发错误消息:
cannot refer to errno directly; see documentation
作为pointed out in another answer,从C函数设置它。