一、文件操作

1.相关概念

1.1**什么是文件?
简单说,文件就是存储在硬件磁盘上的数据集合。
1.2Linux系统中用什么来唯一标识一个文件?
文件描述符:系统中在处理的文件(读、写操作)的时候,需要唯一能够识别这个文件,就需要一个针对文件的标识,以便在其它地方能识别出这个文件,于是就产生了文件描述符。
系统会帮用户默认打开3个文件描述符:
0: 标准输入设备文件的描述符: STDIN_FILENO
1: 标准输出设备文件的描述符: STDOUT_FILENO
2: 标准错误设备文件的描述符: STDERR_FILENO
本质:** 文件描述符是一些整数,简单的说就是一个文件ID,用于在系统中唯一的标识一个文件。文件描述符的总数也就是系统可以打开文件的最多个数,这取决于系统的配置情况可打开的文件描述符总数可利用cat /proc/sys/fs/file-max 来查看。
文件类型,访问权限
1. 文件类型:
普通文件(-);目录文件(d);链接文件(l);设备文件(c);管道文件(p)
2. 访问权限:
读权限(r);写权限(w);可执行权限(x)

2.文件操作方式—系统调用(系统IO函数)

内核模式
void perror(const char *s); 输出错误信息
文件操作函数参考

2.1获取文件属性信息

  1. int access(const char* pathnameint mode);<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21767570/1623897382615-8643f972-bcd2-4ea7-93ae-5824e3003b91.png#align=left&display=inline&height=375&margin=%5Bobject%20Object%5D&name=image.png&originHeight=750&originWidth=1001&size=482513&status=done&style=none&width=500.5)

2.2打开创建文件

int open(const char pathname, int flags);
int open(const char
pathname, int flags, mode_tmode );
image.png

2.3读取文件内容

ssize_t read(int fd,void* buf,size_t count);
image.png

2.4写入文件内容

ssize_t write(int fd,void buf,size_t count);
image.png

char buf[] = {“Linux system programm”};
write(fd,buf,strlen(buf));
char buf1[64] = {“Hello”};
write(fd,buf1,strlen(buf));
char
p = “Linux system programm”;
write(fd,p,strlen(p));

2.5关闭文件

int close(int fd);
image.png

2.6文件随机读写(移动文件位置指针)

off_t lseek(int fd,off_t offset,int whence);
image.png

2.7内存映射(文件映射)

void mmap(void addr,size_t length,int prot,int flags,int fd,off_t offset);
int munmap(void* addr,size_t length);

image.png

2.8文件状态信息获取(类型,权限,大小,创建时间)

int stat(const char path, structstat buf);
int fstat(intfd,structstat *buf);
image.png
文件状态结构体stat

  1. struct stat
  2. {
  3. dev_t st_dev; //文件设备编号
  4. ino_t st_ino; //文件inode节点号
  5. mode_t st_mode; //文件类型,访问权限等
  6. nlink_t st_nlink; //文件的连接数
  7. uid_t st_uid; //文件所有者的用户ID
  8. gid_t st_gid; //文件所有者对应的组ID
  9. dev_t st_rdev; //若文件为设备文件,则表示设备编号
  10. off_t st_size; //文件大小,对应的文件字节数
  11. blksize_t st_blksize; //文件系统的 I/O 缓冲区大小
  12. blkcnt_t st_blocks; //占用文件区块数量,每一区块512 字节
  13. time_t st_atime; //文件最后一次被访问的时间
  14. time_t st_mtime; //文件内容最后一次被修改的时间
  15. time_t st_ctime; //最后一次改变时间(属性改变)
  16. };

image.png
image.png
image.png
image.png

实现ls -l的功能myls-l.c

3.文件操作方式—文件流(标准IO)

3.1为引入标准IO,什么要引入标准IO?
1)系统IO的频繁调用,会引起程序在用户模式与内核模式之间频繁切换,影响系统效率,引入标准IO,采用缓冲机制,减少系统IO的调用频率,提升效率;
2)跨平台使用,因为系统调用取决于系统,不同的系统,系统IO函数是不同的;
系统调用和标准IO库函数调用

image.png

设置缓冲区大小setvbuf()