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.