迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 中的文件描述符

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将讨论 C 编程语言中的文件描述符。


文件描述符概述

文件描述符是一个数字,可用于以唯一方式识别计算机操作系统中打开的文件。 它描述了一个数据资源和可以用来访问它的方法。

文件描述符为我们提供了几种访问文件的方法,例如打开、关闭、读取和写入。 文件描述符是最基本形式的整数。

每个打开的文件都会收到它的编号。 我们称之为文件描述符。

文件描述符是 open() 函数在用于打开文件后返回的内容。 完成后,我们可以利用此文件描述符对该文件执行更多操作。

例如,如果我们希望从打开的文件中读取数据,我们提供文件描述符作为读取数据的函数的输入。

文件表条目:当进程请求打开文件时,文件表条目在内存中形成一个结构,充当打开文件的代理。 这些条目负责维护文件位置。


C 语言中的文件描述符

标准输入 (STDIN)、标准输出 (STDOUT) 和标准错误 (STDERR) 是类似于 Unix 的操作系统上默认使用的前三个文件描述符。

当任何进程开始时,该进程的文件描述符表及其 fd(文件描述符)0、1 和 2 条目会自动打开。 这三个 fd 中的每一个都引用名为 /dev/tty 的文件的文件表中的一个项目。

名称 文件描述符 描述
stdin 0 标准输入
stdout 1 标准输出
stderr 2 标准错误

在 C 中使用文件描述符的系统调用

系统调用是操作系统通过应用程序编程接口 (API) 使用户应用程序可以访问其服务的一种方法。

在此上下文中使用了以下类型的 I/O 系统调用。

使用文件描述符调用 open()

您希望打开的文件的名称是作为第一个参数发送到此方法的名称。 之后,我们提供了一些更多的选项来确定打开方式。

如果无法打开文件,返回值将设置为 -1。 因此,在我们对打开的文件执行更多操作之前,我们需要验证 open() 方法返回的值。

如果它的值为 -1,我们知道 open() 方法无法成功打开文件。

让我们举个例子来实现 open() 调用。

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

int main(int argc, char const *argv[])
{
    int fileDescriptor;
    char buff[1000];

    if ((fileDescriptor = open("abc.txt", O_CREAT | O_RDONLY)) == -1)
    {
        printf("File Open Failed\n");
        exit(0);
    } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);
    }
}

输出:

File Opened Successfully
File Descriptor: 3

我们在 main 函数的最开始定义了一个名为 fileDescriptor 的整型变量。 这将用于存储文件描述符的值。

之后,我们使用 if 语句来测试 open 函数返回的值。 如果它是 -1,我们将终止应用程序并显示一条错误消息。

如果没有,那么我们将能够继续该计划。 字符串 abc.txt 作为第一个输入发送到 open 函数。

这是正在保存的文件的实际名称。 接下来,我们指出应该使用 O_RDONLY。

这表明我们希望以只读模式打开文件。 此外,如果该文件不存在,它应该使用 O_CREAT 创建文件。

以下是我们可能会利用的其他一些论据。

  • O_WRONLY :这将打开文件,以便您只能写入它。
  • O_RDWR :使用此选项,您可以同时打开文件进行读取和写入。

close() 使用文件描述符调用

这样做是为了终止对文件系统的访问。 当程序调用此系统函数时,表明它不再需要该文件。

因此,缓冲区被刷新,文件信息被修改,并且与文件关联的资源被解除分配。

int close(int fd);

使用文件描述符调用 read()

文件描述符是它接受的第一个参数。 作为参数,我们需要提供打开文件时使用的描述符。

指针作为第二个参数发送。 Read 函数将从指定的文件中获取数据并将其存储在您指定的位置。

作为这个指针的值,我们可以提供先前分配的缓冲区的地址。 第三个参数指定应从文件中读取的字节数。

如果成功读取文件,则返回从该文件成功读取的字节数。 如果不成功,它将返回值 -1。

语法:

ssize_t read(int fd, void *buf, size_t count);

使用文件描述符读取文件的示例如下:

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

int main(int argc, char const *argv[])
{
    int fileDescriptor;
    char buff[1000];

    if ((fileDescriptor = open("abc.txt",  O_RDONLY)) == -1)
    {
        printf("File Opening Failed\n");
        exit(0);
    }
    else
    {
        printf("File Opened Successfully\n");
        printf("File Descriptor: %d\n", fileDescriptor);

        if (read(fileDescriptor, buff, sizeof(buff)) == -1)
        {
            printf("Error while reading file\n");
            exit(0);
        }
        else {
            printf("Text of the File: %s\n", buff);
        }
    }
    return 0;
}

输出:

File Opened Successfully
File Descriptor: 3
Text of the File: Jiyik has the solutions to all the programming-related problems

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便