2016-07-13 4 views
2

У меня есть функция C, вызывающая процедуру Go через cgo. Мне нужно запустить процедуру, чтобы правильно установить errno, чтобы поток C мог проверить его errno и действовать соответствующим образом. Не удалось выполнить Google, как установить errno через GoКак установить errno из Go

ответ

3

Чтобы уточнить, вы все равно можете установить его через C-функцию, которую вы вызываете через cgo.

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 из go, см. cgo doesn't like errno on Linux. Из этой нити:

Я не знаю, что это неправильно, но это не имеет значения, так как это не безопасного использования егты в любом случае. Каждый вызов в C может произойти в различных потоках ОС, что означает, что обращение к errno напрямую не гарантирует получение нужного значения.

По состоянию 3880041 попытки обратиться к C.errno будет вызывать сообщение об ошибке:

cannot refer to errno directly; see documentation 

В pointed out in another answer, установив его из C функция работает.

 Смежные вопросы

  • Нет связанных вопросов^_^