C 中的文件描述符
本文将讨论 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
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。