《Unix/Linux系统编程》第七、八章学习笔记

第七章 文件操作

1.文件操作级别

文件操作分为五个级别,按照从低到高的顺序排列如下。

(1)硬件级别

fdisk:将硬盘、U盘或SDC盘分区。
mkfs:格式化磁盘分区,为系统做好准备。
fsck:检查和维修系统。
碎片整理:压缩文件系统中的文件。

(2)操作系统内核中的文件系统函数

每个操作系统内核均可为基本文件操作提供支持。

(3)系统调用

用户模式程序使用系统调用来访问内核函数

(4)1/O库函数

C语言库提供了一系列标准的1/O函数,提高了运行效率。 I/O库函数包括:
FILE mode I/O:fopen(),fread(); fwrite(),fseek(),fclose(),fflush()
char mode I/O:getc(), getchar(),ugetc(); putc(),putchar()
line mode I/O:gets(),fgets(); puts(),fputs()
formatted I/O:scanf(),fscanf(),sscanf(); printf(),fprintf(),sprintf()
除了读/写内存位置的sscanf0/sprintf0函数之外,所有其他I/O库函数都建立在系统调用之上。

(5)用户命令

用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。

(6)sh脚本

虽然比系统调用方便得多,但是必须要手动输入命令。

  1. 文件I/O操作(示意图如下)

 

其中,双线上方表示内核空间,下半部分表示进程的用户空间。

  1. 低级别文件操作

(1) 分区

一个块存储设备可以分为及格逻辑单元,称为分区。

分区表位于第一个扇区的字节便宜446处,该扇区称为设备的主引导记录(MBR)。表有4个条目,每个条目由一个16字节的分区结构体定义。

(2) 格式化分区

fdisk只是将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。为了存储文件,必须先为特定的文件系统准备好分区。该操作习惯上称为格式化磁盘或磁盘分区。

(3) 挂载分区

  1. EXT2文件系统

(1) 数据结构

Linux下,我们可以创建一个包含简单EXT2文件系统的虚拟磁盘。
.dd if=/dev/zero of=mydisk bs=1024 count=1440
.mke2fs -b 1024 mydisk 1440

得到的EXT2文件系统有1440个块,每个块大小为1KB。(之所以选择1440.是因为它是旧软盘的块数)。

(2) Block

B0:引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。

B1:超级块,用于容纳关于整个文件系统的信息。

B2:块组描述符块。EXT2将磁盘块分为几个组。每个组有8192个块(硬盘上的大小为32k)。每组用一个块组描述符结构体描述。

B8:块位图。位图用于分配和回收项。

B9:索引节点位图。一个索引节点就是用于代表一个文件的数据结构。

B10:索引(开始)节点块。

 

 

 

 

 

 

第8章  使用系统调用进行文件操作

  1. 系统调用手册页

man是个好东西。

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

简单的系统调用:

access:检査对某个文件的权限

int access(char •pathname, int mode);

chdir:更改目录

int chdir(const char *path);

chmod:更改某个文件的权限

int chmod(char *path, mode_t mode);

chown:更改文件所有人

int chown(char *name, int uid, int gid);

chroot:将(逻辑)根目录更改为路径名

int chroot (char *patiiname);

getcwd:获取CWD的绝对路径名

char *getcwd(char *buf, int size);

mkdir:创建目录

int mkdir(char *pathname, mode_t mode);

rmdir:移除目录(必须为空)

int rmdir (char *pathname);

link:将新文件名硬链接到旧文件名

int link(char *oldpath, char *newpath);

unlink:减少文件的链接数;如果链接数达到0,则删除文件

int uniink(char *pathname);

symlink:为文件创建一个符号链接

int symliak(char *oldpath, char *newpath);

rename:更改文件名称

int rename(char *oldpath, char *newpath);

utime:更改文件的访问和修改时间

int utime(char *pathname, struct utimebuf *time)

以下系统调用需要超级用户权限。

mount:将文件系统添加到挂载点目录上

int mount(char *specialfile, char *mountDir);

umount:分离挂载的文件系统

int umount(char *dir);

mknod:创建特殊文件

int mknod(char *path, int mode, int device);

  1. 常用的系统调用

stat:获取文件状态信息
int stat(char *filename, struct stat *buf)
int fstat(int filedes,struct stat *buf)
int 1stat(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 writelint fd,char buf[ ], int count)
lseek:重新定位文件描述符的读/写偏移量

int 1seek(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:设置文件创建掩码;文件权限为(mask&~umask)

int umask(int umask);

  1. 链接文件

(1) 硬链接文件

命令 ln oldpath newpath创建从newpath到oldpath的硬链接。

硬链接文件会共享文件系统中相同的文件表示数据结构(索引节点)。文件链接数会记录链接到同一索引节点的硬链接数量。硬链接仅适用于非目录文件。否则,它可能会在文件系统名称空间中创建循环,这是不允许的。

(2) 符号链接文件

软链接:命令ln -s oldpath newpath创建从newpath到oldpath的软链接。

软链接适用于任何文件,包括目录。

缺点:目标文件可能不复存在了。

 

 

问题

使用硬链接的好处在于:

1)由于删除文件时,实际上先对i_links_count做减1,如果i_links_count不为0,则结束,即仅仅删除了一个硬链接,实际文件的数据并没有删除。只有在i_links_count为0时,真正将文件从磁盘上删除。这样,你可以对重要的文件作多个链接,防止文件被删除。

2)允许用户在不进入某个目录的情况下对该目录下面的文件进行处理。

 

posted @ 2021-10-10 18:57  20191309刘嘉祺  阅读(73)  评论(0编辑  收藏  举报