Ngoài câu trả lời của @ RuiFRibeiro và @ BruceEdiger, sự khác biệt mà bạn tạo ra không chính xác là sự khác biệt mà hạt nhân tạo ra. Trên thực tế, bạn có nhiều loại tệp khác nhau: tệp thông thường, thư mục, liên kết tượng trưng, thiết bị, ổ cắm (và tôi luôn quên một số vì vậy tôi sẽ không cố gắng tạo một danh sách đầy đủ). Bạn có thể có thông tin về loại tệp với ls
: đó là ký tự đầu tiên trên dòng. Ví dụ:
$ls -la /dev/sda
brw-rw---- 1 root disk 8, 0 17 nov. 08:29 /dev/sda
'B' ngay từ đầu báo hiệu rằng tệp này là một thiết bị khối. Dấu gạch ngang, có nghĩa là một tệp thông thường, 'l' một liên kết tượng trưng, v.v. Thông tin này được lưu trữ trong siêu dữ liệu của tệp và có thể truy cập thông qua lệnh gọi hệ thống stat
, do đó, hạt nhân có thể đọc khác một tệp và một liên kết tượng trưng chẳng hạn.
Sau đó, bạn thực hiện một phân biệt khác giữa "tệp thực" /bin/bash
và "tệp ảo" thích /proc/cpuinfo
nhưng ls
báo cáo cả hai dưới dạng tệp thông thường để sự khác biệt là một loại khác:
ls -la /proc/cpuinfo /bin/bash
-rwxr-xr-x 1 root root 829792 24 août 10:58 /bin/bash
-r--r--r-- 1 root wheel 0 20 nov. 16:50 /proc/cpuinfo
Điều gì xảy ra là chúng thuộc các hệ thống tập tin khác nhau. /proc
là điểm gắn kết của một hệ thống tập tin giả procfs
trong khi đó /bin/bash
là trên một hệ thống tập tin đĩa thông thường. Khi Linux mở một tệp (nó khác nhau tùy theo hệ thống tệp), nó sẽ tạo ra một cấu trúc dữ liệu file
, trong số các thuộc tính khác, cấu trúc của một số con trỏ hàm mô tả cách sử dụng tệp này. Do đó, nó có thể thực hiện các hành vi khác nhau cho các loại tệp khác nhau.
Ví dụ: đây là các hoạt động được quảng cáo bởi /proc/meminfo
:
static int meminfo_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, meminfo_proc_show, NULL);
}
static const struct file_operations meminfo_proc_fops = {
.open = meminfo_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
Nếu bạn nhìn vào định nghĩa của meminfo_proc_open
, bạn có thể thấy rằng hàm này chứa một bộ đệm trong bộ nhớ với thông tin được trả về bởi hàm meminfo_proc_show
, có nhiệm vụ là thu thập dữ liệu về việc sử dụng bộ nhớ. Thông tin này sau đó có thể được đọc bình thường. Mỗi khi bạn mở tệp, chức năng meminfo_proc_open
sẽ được gọi và thông tin về bộ nhớ được làm mới.