2011-02-04 29 views
5

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ới O_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 trong O_CREATO_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 statvfsf_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ố cho statvfs(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 nha ST_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ụng access(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?

+1

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

Trả lời

1

Bạn cũng có thể popen lệnh mount và kiểm tra kết quả tìm kiếm hệ thống tệp của bạn và xem liệu nó có giữ văn bản " (ro," hay không.

Nhưng một lần nữa, điều đó không nhất thiết phải di động.

Tùy chọn của tôi sẽ không phải lo lắng về việc liệu hệ thống tệp có được gắn kết chỉ đọc hay không. Chỉ cần thử và tạo tệp của bạn và nếu nó không thành công, hãy báo cho người dùng biết lỗi là gì. Và, tất nhiên, cung cấp cho họ tùy chọn lưu nó ở một nơi khác. Tuy nhiên, bạn thực sự phải làm điều đó vì trong bất kỳ kịch bản nào có khoảng cách nhỏ giữa thử nghiệm và làm, bạn có thể thấy những thay đổi tình hình (có thể không đến mức làm cho toàn bộ hệ thống tập tin chỉ đọc được). nhưng, những người hiểu biết, có thể có (hoặc sẽ là trong tương lai) một hệ thống tập tin cho phép điều này).

+0

Đồng ý trong trường hợp chung chỉ bằng văn bản vì điều kiện chủng tộc; đây là lý do tại sao truy cập (2) nói chung là không khuyến khích. Nhưng trong trường hợp cụ thể của tôi, tôi cần đưa ra quyết định chính sách dựa hoàn toàn vào việc liệu FS có được gắn kết chỉ đọc hay không; Tôi không thực sự quan tâm đến việc viết một tệp cho FS. –

+0

'' 'mount''' sử dụng' ''/etc/mtab''' mà chính nó có thể không đúng nếu nó nằm trong hệ thống tập tin ro. – Willem

2
utime(path, NULL); 

Nếu bạn có chữ viết, thì sẽ cho bạn ROFS hoặc - nếu được phép - chỉ cần cập nhật mtime trên thư mục, cơ bản là vô hại.

+1

Về cơ bản vô hại ngoại trừ có lẽ, ví dụ, ... các chương trình sao lưu gia tăng? :-) – paxdiablo

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