【问题标题】:How much information is actually stored in a file descriptor?文件描述符中实际存储了多少信息?
【发布时间】:2012-10-02 18:45:31
【问题描述】:

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

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) 用户空间中对“读取”的调用之间的映射并不像我想象的那么简单,而且这个等式中缺少一些代码。

有什么可以帮助指导我的意见吗?

【问题讨论】:

  • fQuit 在哪里声明?是的,文件描述符只是整数。有关它们的任何信息都必须通过内核文件描述符表中的系统调用来获取。
  • @user1700513 - 你可以假设 fQuite 是 0。

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,很好的简单解释...我想我只是想为自己过度复杂化。 :)
【解决方案2】:

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

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

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

How to obtain FILE * from fd and vice versa

【讨论】:

【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多