2012-10-02 25 views
7

này nghe có vẻ như một câu hỏi kỳ quặc, nhưng khi tôi đi và mở một file:Có bao nhiêu thông tin thực sự được lưu trữ trong một bộ mô tả tệp?

int fd; 
fd = open("/dev/somedevice", O_RDWR); 

chính xác tôi nhận được gì trở lại? Tôi có thể thấy trang người đàn ông nói:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process

Nhưng phải không? Có phải chỉ là một số int hoặc có dữ liệu được đính kèm sau hậu trường không? Lý do tôi hỏi là tôi tìm thấy một số mã (Linux/C), nơi chúng tôi đang mở các tập tin từ user space:

//User space code: 
int fdC; 

if ((fdC = open(DEVICE, O_RDWR)) < 0) { 
    printf("Error opening device %s (%s)\n", DEVICE, strerror(errno)); 
    goto error_exit; 
} 
while (!fQuit) { 
    if ((nRet = read(fdC, &rx_message, 1)) > 0) { 

sau đó vào cuối kernel, các hoạt động tập tin cho mô-đun này (mà nguồn cung cấp fd) bản đồ đọc đến n_read() chức năng:

struct file_operations can_fops = { 
    owner:  THIS_MODULE, 
    lseek: NULL, 
    read: n_read, 

Sau đó mô tả tập tin được sử dụng trong n_read(), nhưng nó được truy cập để lấy dữ liệu:

int n_read(struct file *file, char *buffer, size_t count, loff_t *loff) 
{ 
    data_t * dev; 

    dev = (data_t*)file->private_data; 

Vì vậy ... tôi fi Hình vẽ những gì đang xảy ra ở đây là một trong hai:

A) một bộ mô tả tập tin trở về từ open() chứa nhiều dữ liệu hơn là chỉ một giá trị số nguyên mô tả
Hoặc
B) ánh xạ giữa một cuộc gọi đến "đọc" trong không gian sử dụng isn' t đơn giản như tôi đang làm cho nó ra được và có một số mã mất tích trong phương trình này.

Bất kỳ đầu vào nào có thể giúp hướng dẫn tôi?

+1

'FQuit' được khai báo ở đâu? Và có mô tả tập tin chỉ là số nguyên. Bất kỳ thông tin nào về chúng đều phải được lấy bằng một cuộc gọi hệ thống từ bảng mô tả tệp hạt nhân. –

+0

@ user1700513 - bạn có thể giả sử 'fQuite' là 0. – Mike

Trả lời

10

Trình mô tả tệp chỉ là int. Hạt nhân sử dụng nó như là một chỉ mục cho một bảng chứa tất cả các thông tin liên quan, bao gồm vị trí tập tin, tập tin ops (các hàm hạt nhân cung cấp read(), write(), mmap() vv syscalls), v.v.

Khi bạn open() một tệp hoặc thiết bị, hạt nhân tạo một mục nhập mô tả tệp mới cho quy trình của bạn và điền dữ liệu nội bộ, bao gồm cả tệp ops.

Khi bạn sử dụng read(), write(), mmap(), vv với một mô tả tập tin hợp lệ, hạt nhân chỉ đơn giản là nhìn lên đúng trong kernel chức năng nào được gọi dựa trên ops tập tin trong bảng mô tả tập tin nó có (và đó chỉ mục mô tả tệp). Nó thật sự đơn giản.

+0

Cảm ơn, lời giải thích đơn giản tuyệt vời ... Tôi nghĩ rằng tôi đã cố gắng để làm phức tạp hơn điều này cho bản thân mình. :) – Mike

1

Tôi nghĩ rằng đó chỉ là int. Từ Wikipedia:

Nói chung, một bộ mô tả tập tin là một chỉ số cho một mục trong một cấu trúc dữ liệu hạt nhân cư trú có chứa các chi tiết của tất cả các file mở. Trong POSIX cấu trúc dữ liệu này được gọi là một bảng mô tả tệp, và mỗi tiến trình có bảng mô tả tệp riêng của nó.

3

Ngoài câu trả lời tốt hiện có của @Nominal Aminal, nó là một số nguyên nhưng nó trỏ đến một mục nhập của cấu trúc trong hạt nhân được gọi là bảng mô tả tệp. Đó là ít nhất là trường hợp với Linux. Trong một số lĩnh vực là một phần của struct rằng, một trong những thú vị là:

FILE * pointer; // descriptor to/from reference counts etc. 

Bạn có thể quan tâm sau đây của api mà trao một trong FILE * hoặc mô tả, trả lại khác

How to obtain FILE * from fd and vice versa

+0

' bảng mô tả tệp ',' hệ thống tệp bảng mở': http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic =/com.ibm.aix.genprogc/doc/genprogc/fdescript.htm – n611x007

+0

** Cấu trúc dữ liệu hạt nhân cho các tệp mở **: http://www.cim.mcgill.ca/~franco/OpSys-304-427/ lecture-notes/node27.html – n611x007

+0

Điều này hoàn toàn không chính xác. Trong Linux, 'FILE *' được sử dụng bởi I/O chuẩn (và 'fileno()' và 'fdopen()') không liên quan gì đến kernel ['struct file'] (https: //git.kernel. org/cgit/linux/kernel/git/torvalds/linux.git/cây/include/linux/fs.h # n879), ngoại trừ có thể là sự tương đồng về tên. –

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