【问题标题】:make file immutable - syscall.Chflags("filename", ?)使文件不可变 - syscall.Chflags("filename", ?)
【发布时间】: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


【解决方案1】:

如果您想获取上面列出的标志的常量,可以参考链接https://github.com/snapcore/snapd/blob/master/osutil/chattr.go

【讨论】:

  • 如果该链接将来消失,您能否在答案中列出相关值?
  • 我可以取实际值,但是这些常量是在哪里定义的,所以我可以使用包?
  • @user3431635 据我了解,目前还没有包,鼓励大家自己创建一个并发布到GitHub上,这样你就可以在自己的程序中导入了
  • 我会说这些常量用于特定于 Linux 的系统调用,而 OP 是一个接一个的——Mac OS X 的特定系统调用。
  • @Tony Yip 这种奇怪。存在 Chflags 系统调用,但未定义其参数的常量。我认为我的包没有任何意义,因为它应该与 Chflags 函数一起成为标准库的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2019-10-09
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 2015-01-26
相关资源
最近更新 更多