【问题标题】:Create GNU C File Descriptor Without File Handle创建没有文件句柄的 GNU C 文件描述符
【发布时间】:2016-02-05 00:15:53
【问题描述】:

如果我想将物理文件与其他类型的流(例如套接字)一起使用,我可以简单地将文件句柄转换为文件描述符:

#include <stdlib.h>
#include <stdio.h>

int main(void) {
        FILE *f = fopen("uniquefilename.ext", "w");
        int fd = fileno(f);
        printf("%d\n", fd);
        fclose(f);
        return 0;
}

GNU 标准库是否提供了一种直接获取物理文件描述符的方法?大意是:

int fd = some_call("file_name.ext", "mode");

看来我需要注意的是,我完全知道描述符是如何不隐式绑定到任何特定文件的。当我写“获取物理文件的描述符”时,我被误导了;我应该写的是“创建一个能够访问特定物理文件的描述符”。

【问题讨论】:

  • 物理文件没有文件描述符。
  • @KeithThompson 好悲痛
  • 这是什么意思?一个文件描述符可能与一个物理文件相关联——就此而言,多个文件描述符可能与一个给定的物理文件相关联(在同一进程内)。如果您正在寻找open() 调用,它会分配一个新的文件描述符并将其与指定的物理文件相关联。
  • 文件描述符不能唯一标识特定的磁盘文件...它们标识您的程序打开的文件(和其他东西)。未打开的文件没有文件描述符,并且您拥有的任何给定文件描述符都可能对应于几乎任何内容,具体取决于您的程序打开了什么。

标签: c gnu file-descriptor


【解决方案1】:

没有。

但是,您可以直接使用open 函数!这是 Linux 本身的一部分,而不是 C 标准库(从技术上讲,C 标准库提供了一个小型包装器,允许您将其作为 C 函数调用)。

示例用法:

int fd = open("file_name.ext", O_RDWR); // not fopen
// do stuff with fd
close(fd); // not fclose

注意:手册页建议包括&lt;sys/types.h&gt;&lt;sys/stat.h&gt;&lt;fcntl.h&gt;,对于close,您需要&lt;unistd.h&gt;。头条就这么多,不知道有没有必要。

【讨论】:

  • 另请注意,Windows 没有文件描述符,除非标准库模拟它们。
  • 谢谢!我知道我已经经常使用unistd.h,因为readwrite
  • 是的,我使用 cygwin 或 debian。我很久以前就不再为安装 Windows sdks 而烦恼了
  • 这些头文件在 Linux 上可能不是必需的,但如果您在不同的系统上编译,则可能需要包含所有头文件。
  • 我相信它是 posix 的一部分,而不仅仅是 linux。
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 2018-01-28
  • 2023-04-02
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
相关资源
最近更新 更多