簡體   English   中英

OCaml,Unix.umask的默認值

[英]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的寫訪問)被關閉 目錄需要執行權限,而文件通常不需要執行權限,因此,如果我創建目錄,則其默認權限將為755rwxr-xr-x ),如果我創建文件,則其默認權限將為644rw-r--r-- )。

0o640不是明智的umask值。

要創建目錄,只需執行以下操作:

Unix.mkdir "/some/dir" 0o777

操作系統將自動應用當前的umask(這就是文檔向您推薦它的原因-您實際上不需要自己調用umask )。

您需要執行權限才能將cd轉到目錄。 不要拒絕自己的執行權限(八進制100位)。

(我覺得您誤解了umask的目的,但這是一個單獨的問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM