【发布时间】:2022-08-19 05:11:05
【问题描述】:
我有以下 Go 代码:
package main
import (
\"syscall\"
)
func main() {
_ = syscall.SYS_IOCTL // Assign to _ to avoid compiler error
}
这在 Linux 上编译得很好,但在 Solaris 上编译失败:
$ GOOS=linux GOARCH=amd64 去构建 $ GOOS=solaris GOARCH=amd64 去构建 # ioctl 实验 ./main.go:8:14:未定义:syscall.SYS_IOCTL
ioctl 函数是 POSIX function,所以我希望找到它为所有 Unix 定义。此外,ioctl 出现在 Solaris 11 手册页的第 2 节中,Solaris 11 手册页的第 2 节用于系统调用。
为什么为 Linux 定义了 syscall.SYS_IOCTL 而为 Solaris 未定义?
-
syscall包不努力涵盖 POSIX(或任何其他“已定义”符号子集);相反,它只提供了使 Go 运行时和 Go 标准库正常运行所需的任何内容的最小覆盖范围。如果您需要更多,请考虑golang.org/x/sys/unix,即便如此,您可能需要偶尔为缺少的系统调用/常量/等提供自己的包装器。回顾一下,你对syscall的期望很可能是不正确的,唉。 -
unix.SYS_IOCTL对于 Solaris 也未定义,但已为 Linux 定义。我希望我可以避免使用syscall.Syscall编写任何C,但由于SYS_IOCTL没有定义,并且unix.Ioctl*包装函数都不适合我的用例,看来我必须为@ 编写自己的包装器987654334@。 -
此外,Solaris 仅将系统 libc 视为公共 API,因此大多数时候您不应该直接进行系统调用。由于这个原因,
syscall包可能不会为其他 Solaris 调用生成包装器。
标签: go system-calls solaris ioctl