[英]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.