实际存储在文件描述符中的信息量是多少?

时间:2012-10-02 18:45:32

标签: c linux linux-kernel kernel-module file-descriptor

这可能听起来像一个奇怪的问题,但当我去打开文件时:

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

我究竟回到了什么地方?我可以看到手册页上写着:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process

但是,是吗?它只是一个int还是在幕后附加了数据?我问的原因是我找到了一些代码(Linux / C),我们从用户空间打开文件:

//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) {

然后在内核端,该模块的文件操作(提供fd)映射读取到n_read()函数:

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

然后文件描述符在n_read()中使用,但是它被访问以获取数据:

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

    dev = (data_t*)file->private_data;

所以...我想这里发生的事情是:

A)从open()返回的文件描述符包含的数据多于描述性整数值 或
B)用户空间中对“读取”的调用之间的映射并不像我正在做的那样简单,并且在这个等式中缺少一些代码。

任何可能有助于指导我的输入?

3 个答案:

答案 0 :(得分:10)

文件描述符只是int。内核使用它作为包含所有相关信息的表的索引,包括文件位置,文件操作(提供read()write()mmap()等系统调用的内核函数),等等。

当您open()文件或设备时,内核会为您的流程创建一个新的文件描述符条目,并填充内部数据,包括文件操作。

当您使用有效文件描述符的read()write()mmap()等时,内核只需查找正确的内核函数即可根据文件操作调用在它的文件描述符表中(以及文件描述符索引)。真的很简单。

答案 1 :(得分:3)

除了@Nominal Aminal现有的好答案之外,它是一个整数,但它指向内核中一个名为文件描述符表的结构条目。这至少是Linux的情况。在该结构中属于的几个字段中,一个有趣的是:

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

您可能有兴趣关注给定FILE *或描述符之一的api,返回另一个

How to obtain FILE * from fd and vice versa

答案 2 :(得分:1)

我认为这只是一个int。 来自Wikipedia

  

通常,文件描述符是内核驻留数据结构中包含所有打开文件详细信息的条目的索引。在POSIX中,此数据结构称为文件描述符表,每个进程都有自己的文件描述符表。