📜  文件描述符和文件指针的区别(1)

📅  最后修改于: 2023-12-03 15:40:04.624000             🧑  作者: Mango

文件描述符和文件指针的区别

概述

文件描述符和文件指针是UNIX和Linux中不同的I/O系统的两个核心概念。本文将对两者进行介绍与比较。

文件描述符

文件描述符是一个非负整数,表示内核为每个进程所维护的一个文件或socket的索引。它是进程读写文件或socket的唯一标识符。当一个进程打开一个现有文件或socket时,内核会为它分配一个文件描述符,它是该文件或socket在进程中文件表中的索引值。文件描述符范围一般从0开始,最大可达到1024或更多。

在C语言中,文件描述符是用int类型表示的,通常被定义为常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,分别表示标准输入、标准输出和标准错误输出。

文件指针

文件指针是C语言中的一个概念,是用来标识文件中位置的变量。文件指针在打开文件时被初始化为文件的起始位置,向后读写文件时,文件指针也会随之移动。在C语言中,文件指针是指FILE类型的指针。通过fopen()函数打开文件时,返回指向文件结构体的指针,其中包含了文件指针。

区别

文件描述符和文件指针虽然都用于处理文件 I/O,但它们的使用方式有些不同。文件描述符是内核提供的一种机制,主要用于进程之间的通信和文件的读写。而文件指针则是C语言中提供的一种概念,主要用于文件的读写操作。他们之间的区别可以从以下几个方面来看:

  • 数据类型

文件描述符是int类型的,而文件指针是指向FILE结构体的指针类型。

  • 库函数

文件描述符使用read、write等系统调用函数读写文件,而文件指针使用fread、fwrite等库函数读写文件,屏蔽了底层实现的细节,更加方便易用。

  • 文件操作

文件描述符不能用于文件操作,如文件打开、关闭、移动文件指针等,而文件指针主要用于文件操作。

示例代码

使用文件描述符和文件指针打开同一文件并输出内容:

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

#define BUF_SIZE 1024

int main() {
    int fd, n;
    char buf[BUF_SIZE];

    // 使用文件描述符读取文件
    fd = open("file.txt", O_RDWR);
    if (fd == -1) exit(1);
    n = read(fd, buf, BUF_SIZE);
    write(STDOUT_FILENO, buf, n);
    close(fd);

    // 使用文件指针读取文件
    FILE *fp = fopen("file.txt", "r");
    if (fp == NULL) exit(1);
    fread(buf, BUF_SIZE, 1, fp);
    fwrite(buf, BUF_SIZE, 1, stdout);
    fclose(fp);

    return 0;
}