Khi nào các thư mục ngừng có thể đọc được như các tập tin?


29

Tôi có ấn bản đầu tiên của cuốn sách Môi trường lập trình Unix. Trong chương 2, các tác giả tuyên bố rằng các thư mục có thể đọc được dưới dạng tệp và đề cập đến một số sự thật về định dạng của các tệp này. Họ đưa ra một số ví dụ sử dụng như cat .(trong bài tập 2-2).

Ít nhất là ở Darwin, các thư mục không còn có thể đọc được dưới dạng tệp. Ít nhất, chúng dường như là các tệp có độ dài bằng không khi đọc.

Khi nào sự thay đổi này xảy ra, và có tài liệu chính thức nào về nó không?


1
Tôi nhớ nó đã hoạt động một thời gian 1991sep-1995jun trên sun solaris. Tôi nghĩ rằng nó đã ngừng làm việc cho tôi ở đâu đó trong khoảng thời gian đó là tốt. Khi chúng tôi nâng cấp lên máy sparc với hệ thống V. (không thể nhớ rõ). Nó có thể phụ thuộc vào hệ thống tập tin. Nếu hệ thống tệp không lưu trữ dữ liệu chính xác như được mô tả thì nó sẽ bị hỏng trừ khi lớp tương thích được thêm vào. Hôm nay cũng không hoạt động bằng Debian Gnu + Linux.
ctrl-alt-delor

1
Tôi biết rằng đọc một thư mục dưới dạng tệp làm việc theo Unix System V vào cuối những năm 80 - đầu thập niên 90. Nó hoạt động dưới SunOS. Nó hoạt động dưới một số phiên bản của Irix. Tôi nghĩ rằng việc truy cập hệ thống tệp ảo và cho phép nhiều tổ chức đĩa cơ bản có nghĩa là bạn không thể thực sự hỗ trợ việc này một cách hiệu quả.
Bruce Ediger

8
Hơn (non-authoritative) thông tin có thể được tìm thấy ở đây: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
CAMH

Tôi đã kiểm tra trên AIX và Solaris - thực sự, trên AIX bạn vẫn có thể cat .trong khi trên Solaris 11 (như trong Linux), bạn không thể. Mát mẻ.
gena2x

Câu trả lời:


13

Tham chiếu số lỗi từ thông số kỹ thuật POSIX mới nhất (POSIX.1-2008) nêu rõ:

[EISDIR]

Là một thư mục. Một nỗ lực đã được thực hiện để mở một thư mục với chế độ ghi được chỉ định.

Điều này có nghĩa là, trên HĐH tuân thủ POSIX, bạn sẽ có thể đọc () một thư mục nếu bạn mở nó chỉ đọc (O_RDONLY).

Tôi vừa thử cái này trên hộp NetBSD (thực sự quan tâm đến POSIX) và hoạt động như mong đợi, trong khi nó không thành công trên GNU / Linux với EISDIR (không nên xảy ra).

Một cái nhìn nhanh về Linux cho thấy điều này được dự định ( http://lxr.free-electrons.com/source/fs/libfs.c#L189 ):

ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
{
        return -EISDIR;
}

Mặc dù việc triển khai hệ thống tệp cụ thể có thể ghi đè lên nó (như CEPH thực hiện: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), hành vi mặc định là trả về EISDIR bất cứ khi nào ai đó đang cố gắng đọc () một thư mục, ngay cả khi nó chỉ mở đọc.

Tôi đã theo dõi sự thay đổi này trở lại 2.0.x và ít nhất là đối với hệ thống tập tin ext2, đây vẫn là trường hợp.

Vì vậy, vâng, trên HĐH tuân thủ POSIX, bạn sẽ có thể đọc một thư mục, nhưng một số hạt nhân (như Linux và, rõ ràng, một số khác) chỉ cần bỏ qua điều kiện này và phá vỡ tiêu chuẩn.


6
Theo Open Group, hành vi của Linux ở đây là hợp pháp theo phần mở rộng XSI theo tiêu chuẩn . readdir(2)là di động hơn. Điều đó gợi ý cho tôi câu trả lời chính xác cho câu hỏi của OP là "Khi XSI trở nên phổ biến."
Kevin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.