OCaml,Unix.umask的默认值
考虑以下代码:OCaml,Unix.umask的默认值,unix,ocaml,umask,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)的东西: 我的目的是制作一个目录。如果我能和你一起去 (Unix.umask 0) lor (0o640) 它已创建,但无法访问。 准确地
#load "unix.cma" ;;
print_int (Unix.umask 0) ;;
print_newline () ;;
当我运行它时,我得到2(二进制:000.000.010)。
当我用sudo运行它时,我得到18(二进制:000.010.010)
正如标准库所说,我希望得到类似于0o640(二进制:110.010.000)的东西:
我的目的是制作一个目录。如果我能和你一起去
(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
:
但是,
cd foo
不行
因此,我坚持使用ubuntu 14.04和ocaml 4.01.0顶级版本。您需要执行权限才能将cd刻录到目录。不要拒绝自己的执行权限(八进制100位)
(我感觉您误解了umask的用途,但这是一个单独的问题。)您链接到的文档说明:
类型文件\u perm=int
文件访问权限的类型,例如,
0o640
为用户读写,为组读,其他无
0o640
是一个示例,而不是预期的默认值——它是一个示例file\u perm
值,而不是示例umask
值
我不熟悉OCaml,但在UNIX中,umask通常是每个进程的一个属性,通常设置为默认值,但可以通过调用umask
系统调用进行修改
umask的位是在创建文件或目录时关闭的位。例如,我当前的umask是0022
(或者,在OCaml语法中是0o022
)——这意味着当我创建文件或目录时,相应的位(组和其他的写访问)被关闭。目录需要执行权限,而文件通常不需要,因此如果我创建目录,其默认权限将是755
(rwxr-xr-x
),如果我创建文件,其默认权限将是644
(rw-r--r--
)
0o640
不是合理的umask
值。要创建目录,只需执行以下操作:
Unix.mkdir "/some/dir" 0o777
操作系统将自动应用当前的umask(这就是为什么文档提到它-您实际上不需要自己调用
umask
。文档内容为:“mkdir…file\u perm…请参阅Unix.umask”。我认为对于文件和目录也是一样的。但是,mkdir的权限是那些位已打开(我选中)的权限。所以umask没有理由在mkdir中被引用,是吗?@sarpifeste:假设Unix.mkdir
的作用类似于Unixmkdir
系统调用,是的,umask
是相关的。mkdir
的mode
或file\u perm
参数由当前的umask
修改。可能是OCaml文档假定您熟悉相应的UNIX系统和库调用。因此,如果我想创建目录,就不需要更改umask,也不必将文件perm与umask混合使用。@sarpifeste:一般来说,不需要。umask通常在shell启动脚本(如$HOME/.bashrc
)中设置,或者保留系统提供的默认值。在sudo
下运行时会得到不同的umask,因为root
使用不同的umask(002
vs.022
)。首次使用Unix.umask
时,通过运行shell内置umask>应该会得到与从命令行(在bash上)得到的值相同的值。它应该是为代表您创建的任何文件设置的访问权限的两个补充。此外,要访问目录,必须在目录权限上设置执行位。
Unix.mkdir "/some/dir" 0o777