2016-07-13 52 views
2

我有一個C函數通過cgo調用Go例程。我需要去例行程序正確設置errno,以便C線程可以檢查它是錯誤的,並採取相應的行動。無法谷歌如何設置通過去errno我如何設置errno來自

回答

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 
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功能工作設置它。

相關問題