Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OCaml,Unix.umask的默认值_Unix_Ocaml_Umask - Fatal编程技术网

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
的作用类似于Unix
mkdir
系统调用,是的,
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