2016-07-13 11 views
2

私はcgoを介してGoルーチンを呼び出すC関数を持っています。 Cスレッドがerrnoを検査し、それに応じて動作できるように、errnoを正しく設定するルーチンを実行する必要があります。 Go経由でerrnoを設定する方法についてはGoogleにアクセスできないどのようにしてerrnoをGoから設定するのですか

答えて

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

gorから直接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からそれを設定します。

関連する問題