你如何传递系统调用.Errno to os.退出



假设我尝试获取锁,失败并想退出程序。

err = syscall.Flock(lockfd, syscall.LOCK_EX|syscall.LOCK_NB)
if err == syscall.EAGAIN {
    os.Exit(err)
}

问题是你需要将一个整数传递给 os。退出。

我试过:

os.Exit(int(err))
os.Exit(syscall.EAGAIN)
// Compiles fine, but the cast fails.. no idea why
eerr, _ := err.(*syscall.Errno); os.Exit(int(*eerr)) 
// panics
reflect.ValueOf(err).Int()

似乎您可以比较系统调用。错误到其他整数,但实际上试图获取它的值正在逃避我......

通常只需将syscall.Errno转换为 int

if err == syscall.EAGAIN {
    os.Exit(int(err))
}

syscall.Errno被定义为一个uintptr,可以直接转换为int。不涉及接口、断言或反射。

但是,当将其作为error接口接收时,您需要先断言它。

if err == syscall.EAGAIN {
    os.Exit(int(err.(syscall.Errno)))
}

syscall.Errno用作值,而不是指针,无需尝试用 * 取消引用它。

不要使用 errno 值作为退出代码。

退出值和errno值可能都是整数,但它们在其他方面没有任何共同点。

特别是,EPERM经常(总是?"1",但 shell 经常处理/期望 1 的退出代码是"替代成功"而不是失败(例如,当grep找不到匹配项时)。

再举个例子,系统出口(3)手册页对于 BSD,定义一些用于exit的值。

但是,Go(与操作系统无关)不使用这些。例如,标志包以 "2" 而不是 BSD 推荐的 "64" (EX_USAGE) 退出。(注意,在 BSD 64 上,errno 值是 EHOSTDOWN )。

最新更新