创建不带文件句柄的GNUC文件描述符
如果我想将物理文件与其他类型的流(如套接字)一起使用,我可以简单地将文件句柄转换为文件描述符:创建不带文件句柄的GNUC文件描述符,c,gnu,file-descriptor,C,Gnu,File Descriptor,如果我想将物理文件与其他类型的流(如套接字)一起使用,我可以简单地将文件句柄转换为文件描述符: #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);
#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;
}
我似乎需要注意,我完全知道描述符是如何不隐式绑定到任何特定文件的。我写“获取物理文件的描述符”时有误导性;我应该写的是“创建一个描述符,允许访问特定的物理文件”。它没有
但是,您可以直接使用该功能!这是Linux本身的一部分,而不是C标准库(从技术上讲,C标准库提供了一个小包装器,允许您将其作为C函数调用)
用法示例:
int fd = open("file_name.ext", O_RDWR); // not fopen
// do stuff with fd
close(fd); // not fclose
注意:手册页建议包括
、
和
,对于关闭
,您需要
。这是相当多的标题,我不知道它们是否都是必需的。它不是
但是,您可以直接使用该功能!这是Linux本身的一部分,而不是C标准库(从技术上讲,C标准库提供了一个小包装器,允许您将其作为C函数调用)
用法示例:
int fd = open("file_name.ext", O_RDWR); // not fopen
// do stuff with fd
close(fd); // not fclose
注意:手册页建议包括
、
和
,对于关闭
,您需要
。这是相当多的标题,我不知道它们是否都是必需的。还要注意的是,Windows没有文件描述符,除非标准库模拟它们。谢谢!我知道我已经经常使用unistd.h
,因为read
和write
。是的,我使用cygwin或debian。很长一段时间以前,我甚至不再费心安装windows SDK了。在Linux上可能不需要这些头文件,但如果您在不同的系统上编译,则可能需要包含所有这些头文件。我相信这不仅是Linux,而且是posix的一部分。还要注意,windows没有文件描述符,除非标准库模拟它们。谢谢!我知道我已经经常使用unistd.h
,因为read
和write
。是的,我使用cygwin或debian。我很久以前就不再为安装windows SDK而烦恼了。在Linux上可能不需要这些头文件,但如果在不同的系统上编译,则可能需要包含所有这些头文件。我相信它是posix的一部分,而不仅仅是Linux。物理文件没有文件描述符。@KeithThompson good Grief这是什么意思?一个文件描述符可能与一个物理文件相关联——为此,多个文件描述符可能(在同一进程中)与一个给定的物理文件相关联。如果您正在查找open()
调用,它将分配一个新的文件描述符并将其与指定的物理文件关联。文件描述符不会唯一标识特定的磁盘文件。。。它们标识程序已打开的文件(和其他内容)。未打开的文件没有文件描述符,根据您的程序已打开的内容,您拥有的任何给定文件描述符都可能与几乎任何内容对应。物理文件没有文件描述符。@KeithThompson good Grief这是什么意思?一个文件描述符可能与一个物理文件相关联——为此,多个文件描述符可能(在同一进程中)与一个给定的物理文件相关联。如果您正在查找open()
调用,它将分配一个新的文件描述符并将其与指定的物理文件关联。文件描述符不会唯一标识特定的磁盘文件。。。它们标识程序已打开的文件(和其他内容)。未打开的文件没有文件描述符,您拥有的任何给定文件描述符都可能对应于几乎任何内容,这取决于您的程序已打开的内容。