学习笔记4

文件操作

文件操作级别

  1. 硬件级别:硬件级别文件操作:
  • fdisk:将硬盘、U盘或SDC盘分区。
  • mkfs:格式化磁盘分区,为系统做好准备。
  • fsck:检查和维修系统。
  • 碎片整理:压缩文件系统中的文件。
  1. 操作系统内核中的文件系统函数:每个操作系统内核均可为基本文件操作提供支持,前缀k表示内核函数。如kmount(),kumount(),kmkdir(),krmdir...
  2. 系统调用:用户模式程序使用系统调用来访问内核函数。c语言库函数会发出一个系统调用,使进程进入内核模式来执行相应的内核函数,如open()可进入kopen(),当进程结束执行内核函数时,会返回到用户模式,并得到所需结果。
  3. I/O库函数:系统调用可让用户读/写多个数据块,这些数据块只是一系列字节,I/O库函数为用户读/写单独的字符、行或数据结构记录等。
  4. 用户命令:用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。
  5. sh脚本:用sh编程语言编写的程序,可通过命令解释程序sh来执行。

文件I/O操作


(1)用户模式下的程序执行操作
FILE *fp=fopen("file","r"); or FILE *fp=fopen("file","w");
可以打开一个读/写文件流。
(2)fopen()在用户空间中创建一个FILE结构体,包含一个文件描述符fd、一个fbuf[BLKSIZE]和一些控制变量,它会向内核中的kopen()发出一个fd=open("file",flags=READ or WRITE)系统调用。
(3)fread(ubuf,size,nitem,fp):将nitem个size字节读取到ubuf上,通过:

  • 将数据从FILE结构体的fbuf上复制到ubuf上,若数据足够,则返回。
  • 如果fbuf没有更多数据,则执行(4a)
    (4a)发出read(fd,fbuf,BLKSIZE)系统调用,将文件数据块从内核读到fbuf上,然后将数据复制到ubuf上,直到数据足够或者文件无更多数据可复制。
    (4b)fwrite(ubuf,size,nitem,fp):将数据从ubuf复制到fbuf。
  • 若(fbuf有空间):将数据复制到fbuf上,并返回。
  • 若(fbuf已满):发出write(fd,fbuf,BLKSIZE)系统调用,将数据块写入内核,然后再次写入fbuf。
    (5)对于read(fd,buf,BLKSIZE)系统调用,要确定所需的(dev,blk)编号,然后查询I/O缓冲区高速缓存。
    .get a buffer = (dev,blk);
    (6)对于write(fd,fbuf,BLKSIZE)系统调用,要确定需要的(dev,blk)编号,然后查询I/O缓冲区高速缓存。

使用系统调用进行文件操作

系统调用必须由程序发出。它们的用法就像普通函数调用一样。每个系统调用都是一个库函数,它汇集系统调用参数,并最终向操作系统内核发出一个系统调用。sh命令man 2 NAME显示了系统调用名称的手册页。
int syscall(int a, int b, int c, int d);
第一个参数a是系统调用编号,b、c、d是对应内核函数的参数。

stat系统调用

stat/lstat/ftast系统调用可将一个文件的信息返回。
通过stat系统调用函数查看文件大小

open-close-lseek系统调用

open:打开一个文件进行读、写、追加
int open(char *file, int flags, int mode);
close:关闭打开的文件描述符
int close(int fd);
read:读取打开的文件描述符
int read(int fd, char buf[], int count);
write:写入打开的文件描述符
int write(int fd, char buf[], int count);
lseek:将文件描述符的字节偏移量重新定位为偏移量
int lseek(int fd, int offset, int whence);

文件操作示例程序

显示文件内容
显示input.txt文件内容,相当于cat命令,命令行参数通过参数argc和argv[]传递进来。

复制文件

将文件input.txt内容复制到copy.txt文件中

苏格拉底挑战

针对文件操作知识点的苏格拉底挑战




针对使用系统调用进行文件操作知识点的苏格拉底挑战





posted @ 2023-09-28 00:42  魏子俊  阅读(16)  评论(0)    收藏  举报