【发布时间】:2021-10-12 14:17:59
【问题描述】:
chflags 系统调用标志常量在哪里定义?
import "syscall"
...
flags := ???
err := syscall.Chflags("filename", flags)
在 C 语言中,这些常量在 sys/stat.h 或 unistd.h 中定义:
- UF_NODUMP
- UF_IMMUTABLE
- UF_APPEND
- UF_OPAQUE
- UF_HIDDEN
- SF_ARCHIVED
- SF_IMMUTABLE
- SF_APPEND
- SF_DATALESS
这些常量在 Go 中在哪里?
【问题讨论】:
-
这是 Linux、BSD 还是 Darwin?因为 Linux 没有实现 chflags 系统调用。您必须改用 iotctl。
-
@NickODell:darwin 和 bsd 定义了系统调用
-
最完整的系统调用包总是
golang.org/x/sys/unix,您可以在那里查看它们是否已作为包的一部分生成。如果没有,您必须自己分配值(或在 cli 上将外壳输出到chflags,这是大多数实现所做的) -
在我的例子中是 macOS
-
大部分是@JimB 所说的。事实上,存在一个特殊的标准包
syscall,它定义了系统调用包装器和常量的最小子集——就像你所追求的那样——但是这个子集是由其他标准库包和运行时的需要定义的. (此外,这个包高度依赖于 GOOS/GOARCH。)在类 Unix 系统上发现的许多其他系统调用和相关符号确实在 golang.org/x/sys/unix 中定义,但并非全部可能。如果您需要未定义的内容,只需查看它们是如何在您平台的原生 C 代码中定义的,然后定义您自己的符号。
标签: go system-calls