第7章文件操作
文件操作五个级别
1.硬件级别:普通用户不会接触,但它是创建和维护系统不可缺少的工具
fdisk、mkfs、fsck
2.操作系统内核中的文件系统函数
每个操作系统内核均可为基本文件操作提供支持。在类unix函数中前缀k表示内核函数
3.系统调用
用户模式程序使用系统调用来访问内核函数
其中常见的文件操作级别的系统调用包括:
打开和关闭文件:通过系统调用打开文件,获取文件描述符,并在使用完后通过系统调用关闭文件。
读取和写入文件:使用系统调用从文件中读取数据或将数据写入文件。
定位文件指针:通过系统调用设置文件指针的位置,以便进行随机访问。
创建和删除文件:使用系统调用创建新文件或删除已存在的文件。
修改文件权限:通过系统调用修改文件的访问权限(读、写、执行)。
文件的I/O操作
其中主要分为两块空间:一块为内核空间,另一块为用户空间。
低级别文件操作
1.分区:一个块储存设备,可以分为几个逻辑单元。
大部分的引导程序都可以配置为从不同的分区引导不同的操作系统
分区表位于第一个扇区的字节偏移446处,该扇区称为设备的主引导记录
分区为扩展类型(类型编号=5),那么它可以划分为更多分区,扩展分区在扩展分区区域内形成一个链表
每个扩展分区的第一个扇区是一个本地MBR,每个MBR的446处也有一个分区表
2.格式化分区:为了存储文件,必须先为特定地文件系统准备好分区
3.挂载分区:man&loseup:显示用于系统管理的loseup使用工具命令
第8章使用系统调用进行文件操作
系统调用
两种模式:内核模式和用户模式
内核模式是操作系统运行的特权模式,具有更高的权限和访问系统资源的能力。在内核模式下,操作系统可以执行特权指令、访问底层硬件等。
用户模式是普通应用程序运行的模式,具有较低的权限和受限的访问权限。在用户模式下,应用程序不能直接访问操作系统的敏感资源,如硬件设备或其他进程的内存空间。
使用系统调用进行文件操作
系统调用必须由程序发出。用法就是像普通函数调用一样。
内核的系统调用处理程序根据系统调用编号将调用路由到一个相应的内核函数。
当进程结束执行内核函数时,会返回到用户模式,并得到所需的结果。
常用的系统调用
系统调用操作
stat:获取文件状态信息
int stat(char *filename, struc stat *buf)
int fstat(int filedes, struct stat *buf)
int lstat(char *filename, struct stat *buf)
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)
dup:将文件买哦舒服复制到可用的最小描述符编号中
int dup(int oldfd)
dup2:将oldfd复制到newfd中,如果newfd已打开,先将其关闭
int dup2(int oldfd, int newfd)
link:将新文件硬链接到旧文件
int link(char *oldPath, char *newPath
unlink:取消某个文件的链接;如果文件链接数为0,则删除文件
int unlink(char *pathname)
symlink:创建一个符号链接
int symlink(char *target, char *newpath)
readlink:读取符号链接文件的内容
int readlink(char *path, char *buf, int bufsize)
umask:设置文件创建掩码
int umask(int umask)
链接文件
1.硬链接文件
创建从newpath到oldpath的硬链接:
ln oldpath newpath
系统调用:
link(char *oldpath, char *newpath)
硬链接文件会共享文件系统中相同的文件表示数据结构
unlink(char *pathname)
减少文件的链接数
2.符号链接文件
创建从newpath到oldpath的软链接或符号链接:
ln -s oldpath newpath
系统调用:
symlink(char *oldpath, char *newpath)
适用情况
通过一个较短的名称来访问一个经常使用较长路径名称
将标准动态库名称链接到实际版本的动态库
stat系统调用
1.stat文件状态
2.stat结构体
所有的stat系统调用都以stat结构体形式返回信息
3.opendir-readdir函数
opendir()返回一个DIR指针drip
每个readdir(dirp)调用返回一个dirent指针,指向目录中的下一个条目的dirent结构体
4.readlink函数
读取符号链接文件的内容
5.ls程序
显示目录下的文件信息
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)
umask:设置文件创建掩码,文件权限为(mask&~umask)
read()系统调用
int read(int fd, void *buf, int nbytes);
read()将n个字节从打开的文件描述符读入用户空间中的buf[]
write()系统调用
int write(int fd, void *buf, int nbytes);
write()将n个字节从用户空间中的buf[ ]写入文件描述符,必须打开该文件描述符进行写、读写或追加
遇见的问题
苏格拉底提问