2013-02-25 51 views
6

This bang bài viết, rằngTrên hệ thống/hệ thống tập tin nào là os.open() nguyên tử?

fd = os.open('foo.lock', os.O_CREAT|os.O_EXCL|os.O_RDWR) 

"là nguyên tử trên hầu hết các hệ thống tập tin". Điều đó có đúng không (trên Unix và Windows)? Trên hệ thống tập tin nào?

Trạng thái docs cho biết các cờ được đề cập có sẵn trên Unix và Windows, vì vậy nó giống như một phương pháp đa nền tảng hấp dẫn để khóa tệp (cờ O_CREATO_EXCL đảm bảo quá trình gọi tạo tệp).

+3

Điều này sẽ không thành công ngẫu nhiên trên hệ thống tệp NFS mặc dù nó không được yêu cầu. Tôi nghi ngờ rằng có những người khác (ví dụ: gmail-fs) sẽ không đảm bảo tính độc quyền và sẽ rất khó để xác định liệu 'foo.lock' có nằm trên một giá trị ngữ nghĩa thích hợp hay không. – msw

+1

@msw: Bắt tốt.Các máy chủ NFS, theo giao thức, không duy trì trạng thái "mở" cho một tệp vì thế ngữ nghĩa 'O_EXCL' (cho dù mở hay tạo) trên NFS có phải là chủng tộc hay không. Xem http://lwn.net/Articles/252012/ cho nền tảng kỹ thuật. –

+1

Trên thực tế, [trang mở Linux (2)] (http://man7.org/linux/man-pages/man2/open.2.html) nói "Trên NFS, O_EXCL chỉ được hỗ trợ khi sử dụng NFSv3 hoặc sau đó trên hạt nhân 2.6 hoặc mới hơn ", nhưng tác giả của bài viết được chỉ bởi FrankH. vẫn khuyên không nên. –

Trả lời

4

Đối với UN * X tuân thủ (được chứng nhận POSIX/IEEE 1003.1 theo hệ thống OpenGroup), hành vi được đảm bảo như thông số kỹ thuật OpenGroup cho open(2)ủy quyền điều này. Trích:

O_EXCL
Nếu O_CREAT và O_EXCL được thiết lập, mở() sẽ thất bại nếu tập tin tồn tại. Kiểm tra sự tồn tại của tệp và tạo tệp nếu nó không tồn tại là nguyên tử đối với các chủ đề khác đang thực hiện mở() đặt tên cùng tên tệp trong cùng thư mục với tập hợp O_EXCL và O_CREAT. Nếu O_EXCL và O_CREAT được đặt, và đường dẫn có tên là một liên kết tượng trưng, ​​mở() sẽ thất bại và đặt errno thành [EEXIST], bất kể nội dung của liên kết tượng trưng. Nếu O_EXCL được đặt và O_CREAT chưa được đặt, kết quả sẽ không được xác định.

Hệ thống "phổ biến" UN * X và UN * X (Linux, MacOSX, * BSD, Solaris, AIX, HP/UX) chắc chắn hoạt động như vậy.

Vì API Windows không có open() như vậy, chức năng thư viện có nhất thiết phải được triển khai lại theo API gốc nhưng có thể duy trì ngữ nghĩa.

Tôi không biết hệ thống được sử dụng rộng rãi nào sẽ không tuân thủ; QNX, trong khi không được chứng nhận POSIX, có cùng tuyên bố trong tài liệu của nó cho open(). Các man page * BSD không đề cập rõ ràng đến "atomicity" nhưng Free/Net/OpenBSD thực hiện nó. Ngay cả exotics như SymbianOS (mà giống như Windows không có một LHQ * X-ish open gọi hệ thống) có thể làm nguyên tử mở/tạo.

Để có kết quả thú vị hơn, hãy thử tìm thư viện thời gian chạy hệ điều hành/C có open() nhưng không thực hiện ngữ nghĩa trên cho nó ... và Python sẽ chạy với chủ đề nào MSDOS ...).

Chỉnh sửa: Bài đăng của tôi đặc biệt tập trung vào "hệ điều hành nào có đặc tính này cho open?" - mà câu trả lời là, "khá nhiều tất cả chúng". Wrt. hệ thống tệp mặc dù, hình ảnh khác nhau vì hệ thống tệp mạng - cho dù NFS, SMB/CIFS hay không khác ngừng nói chuyện với fileserver/bị tắt, mọi người khác sẽ bị khóa).

+6

'O_EXCL' không làm điều đó. Điều duy nhất 'O_EXCL' làm là làm cho cuộc gọi thất bại nếu tệp tồn tại và' O_CREAT' được chỉ định. –

Các vấn đề liên quan