Nếu tôi có hệ thống POSIX như Linux hoặc Mac OS X, cách nào tốt nhất và di động nhất để xác định xem đường dẫn có nằm trên hệ thống tệp chỉ đọc không? Tôi có thể nghĩ đến 4 cách ra khỏi đỉnh đầu của tôi:Cách POSIX tốt nhất để xác định xem hệ thống tập tin có được gắn kết chỉ đọc
open(2)
một tập tin vớiO_WRONLY
- Bạn sẽ cần phải tìm ra một tên tập tin độc đáo và cũng vượt qua trongO_CREAT
vàO_EXCL
. Nếu không thành công và bạn có một số lỗi làEROFS
thì bạn biết đó là hệ thống tệp chỉ đọc. Điều này sẽ có tác dụng phụ gây phiền nhiễu thực sự tạo ra một tập tin mà bạn không quan tâm, nhưng bạn có thểunlink(2)
nó ngay lập tức sau khi tạo ra nó.statvfs(3)
- Một trong những lĩnh vực của trởstruct statvfs
làf_flag
, và một trong những lá cờ làST_RDONLY
cho một hệ thống tập tin chỉ đọc. Tuy nhiên, thông số chostatvfs(3)
làm rõ rằng các ứng dụng không thể phụ thuộc vào bất kỳ trường nào có chứa thông tin hợp lệ. Có vẻ như có một khả năng phong nhaST_RDONLY
có thể không được đặt cho hệ thống tệp chỉ đọc.access(2)
- Nếu bạn biết điểm gắn kết, bạn có thể sử dụngaccess(2)
với cờW_OK
miễn là bạn đang chạy với tư cách người dùng có quyền ghi vào điểm gắn kết. Tức là, bạn là người chủ hoặc nó được gắn với UID của bạn như một tham số gắn kết. Bạn sẽ nhận được giá trị trả lại là -1 và số không làEROFS
.Phân tích cú pháp
/etc/mtab
hoặc/proc/mounts
- Có vẻ như không thể di chuyển. Mac OS X dường như không có trong số này, ví dụ. Ngay cả khi hệ thống đã có/etc/mtab
Tôi không chắc chắn các trường là nhất quán giữa các hệ điều hành hoặc nếu các tùy chọn gắn kết cho chỉ đọc (ro
trên Linux) là di động.
Tôi còn thiếu các cách nào khác không? Nếu bạn cần biết nếu một hệ thống tập tin được gắn kết chỉ đọc, bạn sẽ làm như thế nào?
Trên mtab, nếu hệ thống tệp được gắn rw nhưng đi ro sau đó, mtab sẽ không cập nhật./proc/mounts sẽ cập nhật chính xác. – Ryaner