文件操作 -- 系统调用对比C语言下的文件操作
发布日期:2021-07-26 10:17:47 浏览次数:6 分类:技术文章

本文共 3127 字,大约阅读时间需要 10 分钟。

系统调用:(时间长。应当尽量减少系统调用的次数),进入内核之后调用。

函数调用:直接跳到函数的地址进行执行。

UNIX哲学之一 - 一切皆文件(Everything is a file)

文件描述符

对于Linux而言,所有对设备和文件的操作都是使用文件描述符来进行的。

文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录表。
通常,一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这3个文件分别对应文件描述符为0、1和2(也就是宏替换STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO)。

底层文件I/O操作

open(); //函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。close(); //函数是用于关闭一个被打开的文件。当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件。read(); //函数是用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数。//若返回0,则表示没有数据可读,即已达到文件尾。//读操作从文件的当前指针位置开始。当从终端设备文件中读出数据时,通常一次最多读一行。write(); //函数是用于向打开的文件写数据,写操作从文件的当前指针位置开始。对磁盘文件进行写操作,若磁盘已满或超出该文件的长度,则write()函数返回失败。lseek(); //函数是用于在指定的文件描述符中将文件指针定位到相应的位置。
阻塞与非阻塞
fcntl函数

fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞、加锁等标志(这些标志称为File Status Flag),而不必重新open文件。

通过fcntl设置的都是当前进程如何设置访问设备和文件的访问控制属性,但是不设置文件或设备本身的属性,例如文件的读写权限、串口波特率等。

ioctl函数 — 用于向设备发控制或配置命令。
  • ioctl 函数是I/O操作的杂物箱。不能用本章中其他函数表示的I / O操作通常都能用ioctl表示。
  • 终端I/O是ioctl 的最大使用方面(POSIX.1已经用新的函数代替ioctl进行终端I / O操作)。
  • ioctl更多的是用于设备控制,比如磁盘的格式化,MODEM设备,磁带的快进、快倒等。
  • ioctl甚至可以读写一些数据,但是这些数据是不能用read、write读写的,称为out-of-band数据.
  • read\write读写的是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助的数据.
mmap – 将一个文件或者其它对象映射进内存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cKfQhjmh-1574556178588)(en-resource://database/3733:1)]

mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要read/write函数。

C语言库函数I/O操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVChdLKr-1574556178589)(en-resource://database/3735:1)]

着重注意文件有二进制文件以及文本文件

文件类型结构体FILE

  • 缓冲文件系统为每个正使用的文件在内存开辟文件信息区。
  • 文件信息用系统定义的名为FILE的结构体描述。
  • FILE定义在stdio.h中。
typedef struct{
short level; /* 缓冲区满/空程度 */ unsigned flags; /* 文件状态标志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 若无缓冲区不读取字符 */ short bsize; /* 缓冲区大小 */ unsigned char *buffer; /* 数据传送缓冲区位置 */ unsigned char *curp; /* 当前读写位置 */ unsigned istemp; /* 临时文件指示 */ short token; /* 用作无效检测 */} FILE ; /* 结构体类型名 FILE */

打开文件fopen

#include 
FILE *fopen(const char *path, const char *mode);//返回值:成功返回文件指针,出错返回NULL并设置errno,path是文件的路径名,mode表示打开方式。

关闭文件

#include 
int fclose(FILE *fp);//返回值:成功返回0,出错返回EOF并设置errno

以字节为单位的I/O函数

#include 
int fgetc(FILE *stream);int getchar(void);//一般不用//返回值:成功返回读到的字节,出错或者读到文件末尾时返回EOF
#include 
int fputc(int c, FILE *stream);int putchar(int c);//返回值:成功返回写入的字节,出错返回EOF

操作读写位置的函数

#include 
int fseek(FILE *stream, long offset, int whence);//返回值:成功返回0,出错返回-1并设置errnolong ftell(FILE *stream);//返回值:成功返回当前读写位置,出错返回-1并设置errnovoid rewind(FILE *stream);

以字符串为单位的I/O函数

#include 
char *fgets(char *s, int size, FILE *stream);char *gets(char *s);//返回值:成功时s指向哪返回的指针就指向哪,出错或者读到文件末尾时返回NULL//fgets从指定的文件中读一行字符到调用者提供的缓冲区中 --- 保留\n//gets从标准输入读一行字符到调用者提供的缓冲区中。 -- 删除掉\n//gets函数的存在只是为了兼容以前的程序 ---- 一般不用//fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有'\0'。fgets会自动添加的结束符'\0'
#include 
int fputs(const char *s, FILE *stream);int puts(const char *s);//返回值:成功返回一个非负整数,出错返回EOF

以记录为单位的I/O函数

#include 
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);//返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录数小于nmemb,也可能返回0

转载地址:https://blog.csdn.net/qq_39557240/article/details/103221390 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:json文件格式、常见c/c++的json库(一)
下一篇:文件操作(C语言) -- 判断一个文件是否存在

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月29日 00时18分59秒