如何从Go设置errno

时间:2016-07-13 05:38:08

标签: go cgo

我有一个C函数通过cgo调用Go例程。我需要Go例程来正确设置errno,这样C线程就可以检查它的错误并采取相应的行动。无法谷歌如何通过Go设置errno

2 个答案:

答案 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函数设置它。