Unix.mkdir 是否正确设置了 umask?

Does Unix.mkdir set umask correctly?

我调用了 Unix.mkdir "test" 0o000 并希望目录具有 rwxrwxrwx 权限,但具有 -------w-。 调用后 Unix.mkdir "test" (Unix.umask 0o000) 我得到了相同的结果。

我不明白为什么。

如何使用 OCaml Unix 模块创建具有 rwx 权限的目录?

您指定给 Unix.mkdir 的值是您希望目录拥有的权限,由您当前的 umask 修改。如果您指定 0o000,您应该期望创建一个没有任何权限的目录。由于 umask 只能 拒绝 一些额外的权限,您报告的结果是不可能的,至少在 Unix 中是这样。

请注意 Unix.mkdir 的第二个参数不是 umask 值,它是权限值。 OCaml 文档说查看 umask 的原因是让您意识到指定的值将被您的 umask 修改。它是这样工作的:目录将使用您指定的权限创建,除了 set 在您的 umask 中的任何位将 clear 在生成的权限中。换句话说,umask 指定您希望默认拒绝的访问。

如果您真的想创建一个允许所有人使用所有权限的目录,您需要确保您的 umask 为 0。这是合理的 umask0o022:

$ umask
0022
$ ocaml
        OCaml version 4.02.1

# #load "unix.cma";;
# Unix.mkdir "testing1" 0o777;;
- : unit = ()
# ^D
$ ls -ld testing1
drwxr-xr-x  2 jeffsco  staff  68 Jul 30 13:43 testing1

生成的目录具有所有允许的权限,除了 umask 的 0o022 权限。 (组或其他没有写入权限。)

如果在创建目录之前将 umask 设置为 0,会发生以下情况:

$ ocaml
        OCaml version 4.02.1

# #load "unix.cma";;
# Unix.umask 0o000;;
- : int = 18
# Unix.mkdir "testing2" 0o777;;
- : unit = ()
# ^D
$ ls -ld testing2
drwxrwxrwx  2 jeffsco  staff  68 Jul 30 13:45 testing2

umask 设置为 0 时,创建目录的权限将与调用 Unix.mkdir.

时指定的权限完全相同