OCaml,Unix.umask的默认值

时间:2014-06-02 17:36:32

标签: unix ocaml umask

考虑以下代码:

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

当我运行它时,我得到2(二进制:000.000.010)。 当我用' sudo'运行它时,我得到18(二进制:000.010.010) 我希望得到类似0o640(二进制:110.010.000)的东西,正如标准库所说: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 toplevel。

3 个答案:

答案 0 :(得分:2)

您链接的文档说:

  

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

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

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

umask的位是创建文件或目录时 off 的位。例如,我当前的umask是0022(或者,在OCaml语法中,0o022) - 这意味着当我创建文件或目录时,相应的位(组和其他的写访问)是关闭关闭。目录需要执行权限,文件通常不需要,因此如果我创建目录,其默认权限将为755rwxr-xr-x),如果我创建文件,则其默认权限为{ {1}}(644)。

rw-r--r--不是明智的0o640值。

答案 1 :(得分:2)

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

Unix.mkdir "/some/dir" 0o777

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

答案 2 :(得分:1)

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

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

相关问题