文件描述符
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
启动一个进程之后,内核 PCB 的文件描述符表中就已经分配了三个文件描述符。默认支持打开的最大文件数为 1024。
三个特殊的文件描述符
- 标准输入文件
- 标准输出文件
- 标准错误输出文件
#define STDIN_FILENO 0 // 标准输入文件
#define STDOUT_FILENO 1 // 标准输出文件
#define STDERR_FILENO 2 // 标准错误输出文件
系统调用
由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。
Linux系统调用是应用程序与Linux内核进行交互的接口,可以请求内核对其提供服务。这些服务包括文件操作、进程管理、内存管理、网络通信等。系统调用可以实现访问系统资源的安全方式,因为它确保了用户空间和内核空间之间的隔离。在Linux系统中,系统调用以C库函数的形式提供给应用程序,而C库函数会调用相应的汇编指令来触发软中断,将控制权转交给内核进行相应的处理。Linux系统调用的调用号通过eax寄存器传递给内核,不同的系统调用有不同的调用号。
creat
函数
函数原型:
int creat(const char *pathname, mode_t mode);
参数说明:
pathname
:文件路径名,可以是相对路径或绝对路径。mode
:文件创建模式,用于指定文件的权限、所有权等属性。mode_t是一个无符号整型数据类型。
函数返回值:
- 如果文件创建成功,返回文件的描述符;
- 如果文件创建失败,返回-1。
creat函数的作用如下:
- 检查文件路径名是否合法;
- 创建一个新的文件;
- 设置文件的权限、所有权等属性;
- 返回文件的描述符,以便后续进行读写操作。
在使用时,需要包含以下头文件:
#include <sys/types.h> // 包含基本系统数据类型
#include <sys/stat.h> // 包含文件数据结构信息
#include <fcntl.h> // 定义了很多宏和open等函数原型
例如,创建一个其他用户可以读、写的文件"lab.kk"。
#include <sys/types.h> // 包含基本系统数据类型
#include <sys/stat.h> // 包含文件数据结构信息
#include <fcntl.h> // 定义了很多宏和open等函数原型
int main()
{
creat("lab.kk", S_IROTH | S_IWOTH);
return 0;
}
也可以用八进制表示:
#include <sys/types.h> // 包含基本系统数据类型
#include <sys/stat.h> // 包含文件数据结构信息
#include <fcntl.h> // 定义了很多宏和open等函数原型
int main()
{
creat("lab.kk", 0006 );
return 0;
}
open
函数
open
函数用于打开一个文件,并返回一个文件描述符,以便后续对文件进行读写操作。它有两种形式的原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数说明:
pathname
:文件路径名,可以是相对路径或绝对路径。flags
:打开文件时的标志,用于指定打开文件的方式(如只读、只写、追加等)。
mode
:如果需要创建新文件,需要指定文件的创建模式(包括文件权限、所有权等属性),此参数仅在第二种形式中使用。
函数返回值:
- 成功打开文件,返回文件描述符;
- 打开文件失败,返回-1。
open函数的作用是用于打开文件或者创建文件。
例如,
int fd1 = open("lab.kk", O_RDONLY); // 以只读方式打开文件lab.kk
int fd2 = open("lab.kk", O_WRONLY | O_CREAT, 0644); // 以只写方式打开文件,如果文件不存在则创建,设置权限为0644
一、Linux文件编程—open 和创建文件creat函数的使用介绍、文件描述符的概述、linux文件编程的一般步骤、linux文件管理的描述
h