Nó thực sự khá đơn giản, ít nhất là nếu bạn không cần các chi tiết thực hiện.
Trước hết, trên Linux, tất cả các hệ thống tệp (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) đều được triển khai trong kernel. Một số có thể giảm tải công việc cho mã người dùng thông qua FUSE và một số chỉ xuất hiện dưới dạng mô-đun hạt nhân ( ZFS nguyên bản là một ví dụ đáng chú ý về sau do hạn chế cấp phép), nhưng dù sao thì vẫn có một thành phần hạt nhân. Đây là một cơ bản quan trọng.
Khi một chương trình muốn đọc từ một tập tin, nó sẽ phát hành các cuộc gọi thư viện hệ thống khác nhau mà cuối cùng kết thúc trong hạt nhân dưới hình thức một open()
, read()
, close()
chụp liên tục (có thể với seek()
ném trong cho biện pháp tốt). Hạt nhân lấy đường dẫn và tên tệp được cung cấp, và thông qua hệ thống tệp I / O của hệ thống và thiết bị dịch các yêu cầu đọc vật lý này (và trong nhiều trường hợp cũng viết các yêu cầu - ví dụ như cập nhật atime) cho một số lưu trữ bên dưới.
Tuy nhiên, nó không phải dịch các yêu cầu cụ thể sang lưu trữ vật lý, liên tục . Hợp đồng của kernel là việc phát hành tập hợp các cuộc gọi hệ thống cụ thể đó sẽ cung cấp nội dung của tệp được đề cập . Trường hợp chính xác trong lĩnh vực vật lý của chúng ta, "tập tin" tồn tại là thứ yếu.
Trên /proc
thường được gắn những gì được gọi là procfs
. Đó là một loại hệ thống tệp đặc biệt, nhưng vì nó là một hệ thống tệp, nên nó thực sự không khác gì một ext3
hệ thống tệp được gắn ở đâu đó. Vì vậy, yêu cầu được chuyển đến mã trình điều khiển hệ thống tệp Procfs, biết về tất cả các tệp và thư mục này và trả về các mẩu thông tin cụ thể từ cấu trúc dữ liệu kernel .
"Lớp lưu trữ" trong trường hợp này là cấu trúc dữ liệu kernel và procfs
cung cấp giao diện sạch sẽ, thuận tiện để truy cập vào các lớp đó. Hãy nhớ rằng việc gắn Procfs /proc
chỉ đơn giản là quy ước; bạn có thể dễ dàng gắn kết nó ở nơi khác. Trong thực tế, điều đó đôi khi được thực hiện, ví dụ như trong các nhà tù chroot khi quá trình đang chạy ở đó cần truy cập vào / Proc vì một số lý do.
Nó hoạt động theo cách tương tự nếu bạn viết một giá trị cho một số tệp; ở cấp hạt nhân, mà dịch để một loạt các open()
, seek()
, write()
, close()
cuộc gọi mà một lần nữa có được thông qua để trình điều khiển hệ thống tập tin; một lần nữa, trong trường hợp cụ thể này, mã Procfs.
Lý do cụ thể tại sao bạn thấy file
quay trở lại empty
là nhiều tệp được hiển thị bởi Procfs được hiển thị với kích thước 0 byte. Kích thước 0 byte có khả năng là tối ưu hóa ở phía nhân (nhiều tệp trong / Proc là động và có thể dễ dàng thay đổi độ dài, thậm chí có thể từ lần đọc này sang lần đọc tiếp theo và tính toán độ dài của mỗi tệp trên mỗi thư mục đọc có khả năng rất tốn kém). Theo các bình luận cho câu trả lời này, mà bạn có thể xác minh trên hệ thống của mình bằng cách chạy qua strace hoặc một công cụ tương tự, file
trước tiên stat()
hãy thực hiện một cuộc gọi để phát hiện bất kỳ tệp đặc biệt nào, sau đó nhân cơ hội này, nếu kích thước tệp được báo cáo là 0 , hủy bỏ và báo cáo các tập tin là trống rỗng.
Hành vi này thực sự được ghi lại-s
--special-files
file
và có thể được ghi đè bằng cách chỉ định hoặc trên lệnh gọi, mặc dù như đã nêu trong trang hướng dẫn có thể có tác dụng phụ. Trích dẫn dưới đây là từ trang BSD tệp 5.11, ngày 17 tháng 10 năm 2011.
Thông thường, tệp chỉ cố gắng đọc và xác định loại tệp đối số mà báo cáo stat (2) là các tệp thông thường. Điều này ngăn ngừa các vấn đề, bởi vì đọc các tệp đặc biệt có thể có hậu quả đặc biệt. Chỉ định -s
tùy chọn khiến tệp cũng đọc các tệp đối số là các tệp đặc biệt của khối hoặc ký tự. Điều này rất hữu ích để xác định các loại hệ thống tệp của dữ liệu trong các phân vùng đĩa thô, là các tệp đặc biệt. Tùy chọn này cũng khiến tệp bỏ qua kích thước tệp như được báo cáo bởi stat (2) vì trên một số hệ thống, nó báo cáo kích thước bằng không cho các phân vùng đĩa thô.
strace file /proc/version
hoặcltrace -S /proc/version
, tối ưu hóa là khá nhỏ. Nó thực hiệnstat()
cuộc gọi trước và thấy rằng kích thước bằng 0, do đó bỏ quaopen()
- nhưng trước đó nó đang tải một số tệp ma thuật.