第7章 文件操作
教材学习内容总结
1、文件操作级别
文件操作级别
文件操作分为五个级别,按照从低到高的顺序排列如下。
(1)硬件级别∶硬件级别的文件操作包括∶
fdisk∶将硬盘、U盘或SDC盘分区。
mkfs∶格式化磁盘分区,为系统做好准备。
fsck∶检查和维修系统。
碎片整理∶压缩文件系统中的文件。
(2)操作系统内核中的文件系统函数:每个操作系统内核均可为基本文件操作提供支持。下面列出了类 Unix 系统内核中的一些函数,其中前缀k表示内核函数。
kumount(),kumount()
kmkdir(),krmdir()
kchair(),kgetCwd()
klink(),kunlink()
kchmod(),kchown(),kutime()
kcreat(),kopen()
kread(),kwrite()
klseek(),kclose()
keymlink(),kreadlink ()
kstat(),kfstat(),klatat()
kopendir(),kreaddir()
(3)系统调用:用户模式程序使用系统调用来访问内核函数。
(4)I/O库函数:C语言库提供一系列标准的I/O函数,提高运行效率。
(5)用户命令:用户可以使用Unix/Linux命令来执行文件操作。
(6)sh脚本:用sh语言编写的程序,可通过命令解释程序sh来执行。
2、文件I/O操作
3、低级别文件操作
(1)分区
一个块存储设备分为几个逻辑单元,称为分区
下面在Linux下创建一个虚拟磁盘映像文件,并在虚拟磁盘映像文件上运行fdisk
查看帮助文档
(2)格式化分区
为特定的文件系统准备好分区。
(3)挂载分区
创建一个虚拟磁盘映像,在vdisk上运行fdisk来创建一个分区P1
在分区上创建一个循环设备并使用命令读进程。如果遇到权限不够的情况使用sudo
格式化
挂载循环设备
4、EXT2文件系统
磁盘块内容
Block#0:引导块,用于容纳从磁盘引导操作系统的引导程序
Block#1:超级块,用于容纳关于整个文件系统的信息
Block#2:块组描述符块,EXT2将磁盘块分成几个组,每组用一个块组描述符结构体描述
Block#8:块位图,用来表示某种项的位序列
Block#9:索引节点位图,用来代表一个文件的数据结构
Block#10:索引节点块,每个文件都用一个128字节的独特索引节点结构体表示
目录条目:目录包含dir_entry结构
第8章 使用系统调用进行文件操作
教材学习内容总结
1、系统调用手册页
使用man查看
2、系统调用命令
简单的系统调用:
access:检查对某个文件的权限
chdir:更改目录
chmod:更改某个文件的权限
chown:更改文件所有人
chroot:将(逻辑)根目录更改为路径名
getcwd:获取CWD的绝对路径名
mkdir:创建目录
rmdir:移除目录(必须为空)
link:将新文件名硬链接到旧文件名
unlink:减少文件的链接数;如果链接数达到0,则删除文件
symlink:为文件创建一个符号链接
rename:更改文件名称
utime:更改文件的访问和修改时间
需要超级用户权限:
mount:将文件系统添加到挂载点目录上
umount:分离挂载的文件系统
mknod:创建特殊文件
常用系统调用:
stat:获取文件状态信息
open:打开一个文件进行读、写、追加
close:关闭打开的文件描述符
read:读取打开的文件描述符
write:写入打开的文件描述符
lseek:重新定位文件描述符的读/写偏移量
dup:将文件描述符复制到可用的最小描述符编号中
dup2:将oldfd复制到newfd中,如果newfd已打开,先将其关闭
link:将新文件硬链接到旧文件
unlink:取消某个文件的链接;如果链接文件链接数为0,则删除文件
readlink:读取符号链接文件的内容;
3、open-close-lseek系统调用
打开文件和文件描述符open():
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *pathname, int flags, mode_t mode)
如果文件存在就直接打开,不存在就按照指定的文件权限,创建指定名字的新文件
关闭文件描述符close():
#include <unistd.h>
int close(int fd);
关闭一个文件描述符 , 使它不在指向任何文件和可以在新的文件操作中被再次使用。
close返回0表示成功,或者-1表示有错误发生。
lseek文件描述符:
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
read()系统调用:
#include <unistd.h>
int read(int fd,void *buf,int nbytes);
从文件描述符fd相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中。它返回实际读入的字节数,这可能会小于请求的字节数。
如果read调用返回0,就表示没有读入任何数据,已到达了文件尾;如果返回-1,则表示read调用出现了错误。
write()系统调用:
#include <unistd.h>
int write(int fd,void *buf,int nbytes);
把缓冲区buf的前nbytes个字节写入与文件描述符fildes关联的文件中。它返回实际写入的字节数。
如果文件描述符有错或者底层的设备驱动程序对数据块长度比较敏感,该返回值可能会小于nbytes。
如果函数返回值为0,就表示没有写入任何数据;如果返回值为-1,则表明write系统调用出现了错误,错误代码保存在全局变量erro里。