Linux文件操作总结
简述
本文结构:简述文件函数、Linux常用函数、标准C库常用函数、文件操作的应用场景、文件权限问题、Linux文件函数具体实现、标准C库的文件函数具体实现、简单实现对配置文件的增删改查小应用、内容小结
内核对文件的操作原理、管理机制是非常复杂繁多的,涉及到内核的访问机制。
Unix、Linux系统调用的常用文件函数有:open、write、lseek、access、read、close等
标准C库常用的函数有:fopen、fwrite、fseek、fread、fclose、fputc、feof、fgetc、fflush等
二者区别主要体现在:
1.适用范围、移植性、返回值
open、write、lseek、read、close等一般这些没有f开头的函数只能在Unix、Linux系统上用,移植性有限,open函数返回的是一个文件描述符。
而fopen、fwrite、fseek、fread、fclose、fputc、feof、fgetc等一般有f开头的函数不仅适用于Unix、Linux系统还适用Windows、ios或者其它操作系统,简而言之就是适用范围广,具有良好的移植性,fopen返回的是一个指向文件结构的指针。
移植性:代码在不同环境是否仍然适用
2.文件IO层次、缓冲区
open离内核近,低级IO,运行在内核态,无缓冲,读写文件操作时每次都要进行用户态与内核态切换,效率低
fopen离内核远,高级IO,运行在用户态,有缓冲,读写文件时减少用户态与内核态的切换,效率高,关于缓冲,随机访问则相反
总地来说:不同场景需要用到不同函数,配合使用。
Unix、Linux常用函数原型
函数一般在man手册第二页查
man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);//创建并打开文件
int open(const char *pathname, int flags, mode_t mode);//创建并打开文件
int creat(const char *pathname, mode_t mode);//open函数包含creat的功能,比较少用
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);//将内容写进文件
ssize_t read(int fd, void *buf, size_t count);//读文件内容
int close(int fd);//关闭文件
简述标准C库常用函数原型
函数用man手册直接查
man fopen
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);//创建并打开文件
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);//写
int fclose(int fd);//关闭文件
对文件的操作有哪些应用场景呢?
关于Linux对文件的操作应用场景,例如:打印发票、账单、记录游戏的进度、配置游戏参数等,这些都需要操作系统自动帮我们操作,打开文件、然后增删改查、然后关闭文件。我们只需要运行这个可执行文件,就可以自动化地实现某些功能。
那怎么实现这些功能呢?这就需要C语言基础知识,特别是对字符串操作的函数,例如计算字符串长度strlen、字符串初始化memset、输入字符串gets、输出字符串puts、比较字符串strcmp、字符串大小写转换strupr和strlwr、复制字符串strcpy、memcpy、strncpy、拼接字符串strcat、分割字符串strtok、查询字符串strchr和strstr等,具体他们的原型是什么,可以用man手册直接查。
关于文件权限
创建并且打开文件时,怎么给它权限呢?
第一种:用man手册里的宏,man 2 open翻一翻,会有具体介绍
第二种:用数字形式,计算权限是用八进制计算的,简单地介绍第二种吧
从图中可以看到第一个 - 符号后包含 - 共有9个字符,连续三个是分别对应一组用户权限
看绿色的gcc生成的a.out可执行文件
第一个 - 符号(0)是指普通文件,同时也是8进制的表示方式
第一组rwx是该用户拥有者的权限,可读可写可执行
第二组r-x是文件拥有者所在组的其它成员的权限,可读可执行
第三组r-x是其它用户组的成员的权限,可读可执行
例如:如果仅限于自己使用,把权限设置成可读可写
-rwx------
0 110 000 000 // - 用0表示
0 6 0 0 //对应八进制数
Linux open函数具体实现
第一步—打开文件
用两个参数的open函数不能创建文件,只能打开
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
//1、int open(const char *pathname, int flags);
//2、int open(const char *pathname, int flags, mode_t mode);
int main()
{
int fd;//定义一个int型的变量来储存open返回的文件描述符
fd = open("./demo1.c",O_RDWR);//用了两个参数的open,第一个参数./意思是当前路径下打开demo1.c文件,第二个参数是可读read可写write
if(fd == -1)
{
perror("open");//perror函数作用:在终端显示关于打开文件错误信息
exit(-1);//如果打开文件失败一般就退出进程,需要头文件#include <stdlib.h>
}
printf(