[英]OCaml, default value for Unix.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顶层。
您链接到的文档说:
type file_perm = int
文件访问权限的类型,例如0o640
是为用户读写的,为组是读取的,其他用户为无
0o640
是一个示例,而不是预期的默认值;它是示例file_perm
值,而不是示例umask
值。
我不熟悉OCaml,但是在UNIX中,通常,umask是每个进程的属性,通常设置为默认值,但可以通过调用umask
系统调用进行修改。
umask的位是在创建文件或目录时关闭的位。 例如,我当前的umask是0022
(或者用OCaml语法是0o022
),这意味着当我创建文件或目录时,相应的位(对group和others的写访问)被关闭了 。 目录需要执行权限,而文件通常不需要执行权限,因此,如果我创建目录,则其默认权限将为755
( rwxr-xr-x
),如果我创建文件,则其默认权限将为644
( rw-r--r--
)。
0o640
不是明智的umask
值。
要创建目录,只需执行以下操作:
Unix.mkdir "/some/dir" 0o777
操作系统将自动应用当前的umask(这就是文档向您推荐它的原因-您实际上不需要自己调用umask
)。
您需要执行权限才能将cd转到目录。 不要拒绝自己的执行权限(八进制100位)。
(我觉得您误解了umask的目的,但这是一个单独的问题。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.