-1

考虑这段代码:

#load "unix.cma" ;;
print_int (Unix.umask 0) ;;
print_newline () ;;

当我运行它时,我得到 2(二进制:000.000.010)。当我使用“sudo”运行它时,我得到 18(二进制:000.010.010),正如标准库所说:http ://caml.inria.fr /pub/docs/manual-ocaml/libref/Unix.html#TYPEfile_perm 我的目的是做一个目录。如果我做到了

(Unix.umask 0) lor (0o640)

它已创建但无法访问。准确查看二进制数让我想到可以恢复默认掩码。所以,我使用这个创建一个目录:

let revert_mask m =
  let user  = (m land 0b000000111) in
  let group = (m land 0b000111000) lsr 3 in
  let other = (m land 0b111000000) lsr 6 in
  (user lsl 6) lor (group lsl 3) lor other
;;

然后,我创建我的目录:

let mask = (revert_mask (Unix.umask 0)) lor 0o640 ;;
print_int mask ;;
print_newline () ;;
Unix.mkdir "foo" mask ;;

我得到 416 (0o640),对应于我的

ls -l | grep foo

drw-r----- 2 (me) (me) 4096 june   2 19:23 foo

然而,一个

cd foo

不会工作。

所以,我坚持使用 ubuntu 14.04 和 ocaml 4.01.0 顶层。

4

3 回答 3

2

您链接到的文档说:

type file_perm = int
文件访问权限的类型,例如0o640用户读写,组读,其他人无

0o640是一个示例,而不是预期的默认值——它是一个示例file_perm值,而不是示例umask值。

我不熟悉 OCaml,但在 UNIX 中,一般来说,umask 是每个进程的一个属性,通常设置为默认值,但可以通过调用umask系统调用来修改。

umask 的位是在创建文件或目录时关闭的位。例如,我当前的 umask 是0022(或者,在 OCaml 语法中,0o022)——这意味着当我创建文件或目录时,相应的位(组和其他人的写访问权限)被关闭。目录需要执行权限,而文件通常不需要,所以如果我创建一个目录,它的默认权限是755rwxr-xr-x),如果我创建一个文件,它的默认权限是644rw-r--r--)。

0o640不是一个合理的umask值。

于 2014-06-02T17:49:06.257 回答
2

要创建目录,只需执行以下操作:

Unix.mkdir "/some/dir" 0o777

操作系统将自动应用当前的 umask(这就是文档向您提及它的原因 - 您实际上不需要调用umask自己)。

于 2014-06-03T10:29:25.053 回答
1

您需要执行权限才能 cd 到目录。不要拒绝自己的执行权限(八进制 100 位)。

(我感觉您误解了 umask 的目的,但这是一个单独的问题。)

于 2014-06-02T17:48:37.603 回答