网站seo入门基础教程书籍,农业信息网站建设,专业的网站建设哪家好,美容美发网站模板文件描述符
文件描述符#xff08;File Descriptor#xff0c;简称 FD#xff09;是 UNIX 和 UNIX-like 系统中用于代表和识别打开的文件或其他I/O资源的一种抽象标识。它是一个非负整数#xff0c;内部由操作系统进行管理和分配。文件描述符可以代表文件、套接字、管道等…文件描述符
文件描述符File Descriptor简称 FD是 UNIX 和 UNIX-like 系统中用于代表和识别打开的文件或其他I/O资源的一种抽象标识。它是一个非负整数内部由操作系统进行管理和分配。文件描述符可以代表文件、套接字、管道等各种类型的I/O资源。
核心概念 标准文件描述符当一个进程启动时它默认会拥有三个已经打开的文件描述符。 0 - 标准输入STDIN1 - 标准输出STDOUT2 - 标准错误输出STDERR 分配当新的文件或其他I/O资源被打开时例如使用 open() 或 socket()操作系统会为它分配最小的可用文件描述符。 生命周期文件描述符在资源打开时被创建当资源被关闭时例如使用 close()被回收。 重定向在 shell 编程中可以重定向文件描述符将输出写入文件或从文件中读取输入。 表内核维护一个文件描述符表每个进程都有其自己的文件描述符表。表中的每个条目都指向一个文件、套接字或其他类型的I/O资源。 限制每个进程都有一个文件描述符的上限即它可以同时打开的最大文件数量。这个上限可以通过 ulimit 命令查看和修改在某些系统中。
使用文件描述符的例子 使用 open() 打开文件 int fd open(example.txt, O_RDONLY);
if (fd -1) {perror(open);
}使用 read() 从文件描述符读取数据 char buffer[256];
ssize_t bytes_read read(fd, buffer, sizeof(buffer));使用 write() 向文件描述符写入数据 const char *message Hello, world!;
ssize_t bytes_written write(fd, message, strlen(message));使用 close() 关闭文件描述符 close(fd);文件描述符是 UNIX 和 UNIX-like 系统中低级I/O操作的核心。然而在许多应用编程场景中高级I/O函数如标准C库中的 fopen(), fread(), fwrite() 等提供了更简洁和可移植的接口它们在内部使用文件描述符但为开发者提供了更高级和更便于使用的抽象。
open()
open() 是在 UNIX 和 Linux 系统编程中常用的一个系统调用用于打开或创建文件。一旦文件被打开open() 会返回一个文件描述符这是一个非负整数可以用来引用该文件进行进一步的操作如读、写或关闭文件。
函数原型
#include sys/types.h
#include sys/stat.h
#include fcntl.hint open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);第二个原型允许为新创建的文件指定权限。
参数
pathname: 要打开或创建的文件的路径名。flags: 指定如何打开文件的标志。这些标志可以组合使用使用 | 运算符。常见的标志有 O_RDONLY: 以只读方式打开文件。O_WRONLY: 以只写方式打开文件。O_RDWR: 以读写方式打开文件。O_CREAT: 如果文件不存在则创建文件。O_EXCL: 与 O_CREAT 一起使用确保文件在被创建时是新的即如果文件已存在则调用失败。O_TRUNC: 如果文件已存在且成功以写方式打开则截断文件的长度为0。O_APPEND: 打开文件进行追加每次写都写在文件末尾。 mode: 当使用 O_CREAT 标志时该参数用于指定新文件的权限。它是一个八进制数如 0644表示文件所有者有读写权限而组成员和其他用户只有读取权限。
返回值
成功时返回一个非负整数即文件描述符。失败时返回 -1并设置 errno 以指示错误。
示例
只读方式打开一个已存在的文件
int fd open(test.txt, O_RDONLY);读写方式打开一个文件如果文件不存在则创建它并设置权限为 0644
int fd open(test.txt, O_RDWR | O_CREAT, 0644);只写方式打开一个文件以追加内容
int fd open(test.txt, O_WRONLY | O_APPEND);使用 open() 打开的文件应当在完成操作后使用 close() 函数关闭。这是良好的编程实践可以避免资源泄漏。
lseek()
lseek() 是一个 UNIX 和 Linux 系统调用用于改变文件描述符所指示的文件的当前读/写位置。这个系统调用允许应用程序随机访问文件中的任何位置而不仅仅是连续地读取或写入文件。
原型
其函数原型如下
#include sys/types.h
#include unistd.hoff_t lseek(int fd, off_t offset, int whence);参数
fd: 文件描述符通常是之前由 open() 函数返回的。offset: 相对于基准点由 whence 参数指定的字节偏移量。whence: 基准点可以是以下之一 SEEK_SET: 文件的开始位置。SEEK_CUR: 文件的当前位置。SEEK_END: 文件的结束位置。
返回值
如果成功lseek() 返回新的文件偏移量相对于文件开始的位置。如果失败返回 -1 并设置 errno。
示例
下面是一个简单的示例展示了如何使用 lseek()
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include unistd.h
#include stdio.hint main() {int fd;off_t position;fd open(test.txt, O_RDWR);if (fd -1) {perror(Error opening the file);return 1;}// Move file pointer 10 bytes from the startposition lseek(fd, 10, SEEK_SET);if (position (off_t) -1) {perror(lseek error);close(fd);return 1;}printf(Current file position: %ld\n, position);close(fd);return 0;
}在这个示例中我们首先打开一个名为 “test.txt” 的文件。然后我们使用 lseek() 将文件指针从文件的开始位置向前移动10个字节。最后我们输出了文件的新位置并关闭了文件。
需要注意的是并不是所有的文件类型都支持 lseek()。例如尝试在某些类型的设备文件或管道上使用 lseek() 可能会失败。