当前位置:首页 > 系统教程 > 正文

基础IO入门:文件描述符的引入(Linux系统编程核心概念)

基础IO入门:文件描述符的引入(Linux系统编程核心概念)

Linux系统编程中,基础IO是必须掌握的知识点。而文件描述符(File Descriptor)则是理解IO操作的核心。本文将带你一步步引入文件描述符的概念,让你从零开始掌握它。

从C库函数到系统调用

当我们使用C语言进行文件操作时,通常使用fopen、fclose、fread、fwrite等函数。这些是C标准库提供的函数,它们内部实际上调用了操作系统的系统调用,如open、close、read、write。在Linux中,这些系统调用通过文件描述符来操作文件。

什么是文件描述符?

文件描述符是一个非负整数,它是内核为了高效管理已被打开的文件所创建的索引。当进程打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。后续对该文件的所有操作,都通过这个文件描述符进行。

在Linux中,每个进程都有一个文件描述符表,记录该进程打开的所有文件。文件描述符就是这个表的索引。默认情况下,每个进程启动时会有三个已经打开的文件描述符: 0:标准输入(stdin) 1:标准输出(stdout) 2:标准错误(stderr)

基础IO入门:文件描述符的引入(Linux系统编程核心概念) 文件描述符 基础IO Linux系统编程 文件操作 第1张

文件描述符的分配规则

当我们使用open打开一个新文件时,内核会分配当前进程中最小的未使用文件描述符。例如,如果标准输入、输出、错误都已占用,那么第一个打开的文件将获得文件描述符3。

示例代码

下面是一个简单的示例,打开一个文件并获取文件描述符

#include #include #include #include #include int main() {    int fd = open("test.txt", O_RDONLY);    if (fd == -1) {        perror("open");        return 1;    }    printf("文件描述符: %d", fd);    close(fd);    return 0;}  

运行该程序,你将看到输出的文件描述符通常是3(如果之前没有关闭其他文件)。

文件描述符与FILE指针的关系

C标准库中的FILE结构体是对文件描述符的封装。FILE结构体内部包含了一个文件描述符成员,以及缓冲区等。例如,在glibc中,FILE结构体中的_fileno字段就是文件描述符。所以,fopen返回的FILE*实际上是对底层文件描述符的包装。

文件描述符的重要性

文件描述符Linux系统编程中进行IO操作的基础。理解它,有助于我们深入理解重定向、管道、网络编程等高级概念。因此,掌握基础IO,从理解文件描述符开始。

通过本文,你应该对文件描述符有了初步的认识。在后续文章中,我们将继续探讨文件描述符的更多特性,如文件描述符的复制、重定向等。