考虑以下代码:
#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。
答案 0 :(得分:2)
您链接的文档说:
type file_perm = int
文件访问权限的类型,例如0o640
为用户读取和写入,为组读取,为其他人读取
0o640
是一个示例,而不是预期的默认值 - 它是一个示例file_perm
值,而不是示例umask
值。
我不熟悉OCaml,但在UNIX中,umask通常是每个进程的属性,通常设置为默认值,但可以通过调用umask
系统调用进行修改。
umask的位是创建文件或目录时 off 的位。例如,我当前的umask是0022
(或者,在OCaml语法中,0o022
) - 这意味着当我创建文件或目录时,相应的位(组和其他的写访问)是关闭关闭。目录需要执行权限,文件通常不需要,因此如果我创建目录,其默认权限将为755
(rwxr-xr-x
),如果我创建文件,则其默认权限为{ {1}}(644
)。
rw-r--r--
不是明智的0o640
值。
答案 1 :(得分:2)
要创建目录,只需执行以下操作:
Unix.mkdir "/some/dir" 0o777
操作系统将自动应用当前的umask(这就是文档引用它的原因 - 您实际上不需要自己调用umask
)。
答案 2 :(得分:1)
您需要执行权限才能cd到目录。不要拒绝自己执行权限(八进制100位)。
(我觉得你误解了umask的目的,但这是一个单独的问题。)