2012-07-02 42 views
11

Ở hầu hết các địa điểm, các quyền được định nghĩa là số bát phân ở định dạng 0777. Nhưng lệnh umask của UNIX (do đó os.umask()) cần 0o000 để tạo các bit cấp phép của 0o7770o022 tương đương với 0o755 trong sự hiểu biết của tôi.Tại sao đối số của os.umask() đảo ngược? (umask 0o000 làm chmod 0o777)

Tôi nghe nói rằng UNIX umask bị đảo ngược vì một lý do nào đó và tôi không hiểu lý do đằng sau nó. Ai đó có thể giải thích sự không thống nhất này?

+2

Đó là "mặt nạ" - đó là ý nghĩa của từ ngữ trong ngữ cảnh này; một cái gì đó cho phép chỉ các bit unset thông qua (suy nghĩ của các mặt nạ được sử dụng cho bức tranh, chipmaking, và như thế). Nếu nó không hoạt động theo cách này, nó sẽ được gọi là cái gì đó khác. –

Trả lời

11

Không có sự mâu thuẫn thực sự, vì mối quan hệ giữa umaskchmod hoàn toàn có thể được ghi lại bằng phương trình. Rõ ràng, umask đặt đối diện với chmod, nó đã được tạo ra như thế này trở lại trong những ngày cũ.

Ví dụ: 022 (mặc định thông thường umask) tạo 755. Nó hoạt động như thế này:

  • 7 - 0 = 7 trở thành byte đầu tiên
  • 7 - 2 = 5 trở thành thứ hai và thứ ba byte

Sử dụng ví dụ này, umask 777 tạo ra một tập tin với chmod 000, umask 112 sẽ bằng chmod 664. Theo như tôi biết, điều này xảy ra vì lệnh umask ban đầu được tạo ra để cho biết bit nào sẽ cho phép tệp NOT sau khi được tạo (do đó là sự chú ý).

Trong khi nó có thể gây phiền nhiễu, nó thực sự không khó để làm quen với nó. Chỉ cần nghĩ cách bạn sẽ chmod tệp của mình và trừ byte bạn muốn từ 7 và bạn sẽ nhận được giá trị umask. Hoặc, khi bạn đang ở IDE, viết mã của bạn, không sử dụng umask, mà đúng hơn là tạo tệp (với mặc định là umask) và sau đó sử dụng, bằng Python, os.chmod() thay thế.

+0

"Theo như tôi biết, điều này xảy ra bởi vì lệnh umask ban đầu được tạo ra để cho biết bit quyền của tệp sẽ KHÔNG có sau khi nó được tạo (do đó là sự chú ý)." Câu trả lời tuyệt vời! Bây giờ tôi có thể sống yên bình! :) – ddinchev

+0

"Mặt nạ" là thứ bạn "che giấu" hoặc "xóa". Đó là lý do tại sao chúng tôi sử dụng bitwise AND ("&" trong C) để "mặt nạ" mọi thứ. – Fixee