【问题标题】:Why is syscall.SYS_IOCTL defined for Linux but not for Solaris?为什么 syscall.SYS_IOCTL 是为 Linux 定义的,而不是为 Solaris 定义的?
【发布时间】: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


【解决方案1】:

syscall 不完整,并且自 2015 年以来未更新所有 syscall 定义之后添加的所有系统调用定义仅在 golang.org/x/sys/unix替换导入路径并将其添加到 go modules 文件中。

package main

import (
    "golang.org/x/sys/unix"
)

func main() {
    _ = unix.SYS_IOCTL // Assign to _ to avoid compiler error
}

这将达到您想要的效果,并且被认为是稳定和受支持的。

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2011-05-05
    相关资源
    最近更新 更多