代码之家  ›  专栏  ›  技术社区  ›  Mike

文件描述符中实际存储了多少信息?

  •  7
  • Mike  · 技术社区  · 12 年前

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

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

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

    3 回复  |  直到 12 年前
        1
  •  10
  •   Nominal Animal    12 年前

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

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

    当您使用 读取() , 写入() , mmap() 等。使用有效的文件描述符,内核只需根据它所拥有的文件描述符表中的文件操作(以及文件描述符索引的文件操作)查找正确的内核内函数即可调用。真的就这么简单。

        2
  •  3
  •   Community CDub    8 年前

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

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

    您可能对以下api感兴趣,给定FILE*或描述符中的一个,返回另一个

    How to obtain FILE * from fd and vice versa

        3
  •  1
  •   Maria Ines Parnisari    12 年前

    我认为这只是一个 int 。 从…起 Wikipedia 以下为:

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