У меня есть функция C, вызывающая процедуру Go через cgo. Мне нужно запустить процедуру, чтобы правильно установить errno, чтобы поток C мог проверить его errno и действовать соответствующим образом. Не удалось выполнить Google, как установить errno через GoКак установить errno из Go
2
A
ответ
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 функция работает.