第七、八章学习笔记

知识点归纳

文件操作级别:

1)硬件级别

fdisk将硬盘、U盘或SDC盘区分
mkfs格式化磁盘区分,为系统做好准备
fsck检查和维修系统
碎片整理压缩文件系统中的文件
其中大多数是针对系统的实用程序。普通用户可能永远都不需要它们,但是它们是创建和维护系统不可缺少的工具。

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

前缀k表示内核函数
为基本文件操作提供支持

3)系统调用

用户模式程序使用系统调用来访问内核函数
理解:每个库函数都会发出一个系统调用函数,使进程进入内核模式来执行相应的内核函数

4)I/O库函数

调用缓冲区到程序中,对数据块进行处理,同时提高运行效率。

5)用户命令

用户用Unix/Linux命令来执行文件操作(并不是编写程序)

6)sh脚本

虽然比系统调用方便多,但是必须手动输入命令,如果使用的是GUI,必须要拖放文件图标和点击指向设备来输入。sh语言包含所有的有效Unix/Linux命令,还支持变量和控制语句。

文件O/I操作

用户模式下的程序执行操作
FILE *fp = fopen(“file”, “r”);or FILE *fp = fopen(“file”,”w”);

原理:fopen()在用户(heap)空间中创建一个FILE结构体,包含一个文件描述符fd、一个fbuf[BLKSIZE]和一些控制变量。会向内核中的 kopen() 发出一个fd=open(“file”,flags=READ or WRITE)系统调用。构建一个OpenTable来表示打开文件示例。OpenTable的mptr指向内存中的文件INODE。

MBR 中最主要的功能就是存储启动引导程序。

系统调用

在操作系统中,进程有两种模式:

内核 (Kmode)
用户 (Umode)

系统调用(简称syscall)是一种允许进程进入Kmode以 执行Umode不允许操作的机制
复刻子进程、修改执行映像.甚至是终止等操作都必须在内核中执行。
系统调用(简称syscall)是一种允许进程进入Kmode以 执行Umode不允许操作的机制。

系统调用手册

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

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);

权限数字表示法

每个数字都是是由r=4;w=2;x=1相加的结果得出来的
-rw------- (600) – 只有属主有读写权限。
-rw-r–r-- (644) – 只有属主有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) – 只有属主有读、写、执行权限。
-rwxr-xr-x (755) – 属主有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx–x--x (711) – 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) – 所有用户都有文件读、写权限。这种做法不可取。
-rwxrwxrwx (777) – 所有用户都有读、写、执行权限。更不可取的做法。

二、实验

在linux中创建并挂载分区

虚拟磁盘映像创建

查看现有分区

在刚创建的磁盘映像文件上运行fdisk

进行分区操作并同步

使用losetup将该文件映射到loop设备
sudo losetup /dev/loop0 hello.img
使用fdisk -l查看创建好的虚拟磁盘映像

格式化(创建文件系统)

mkfs.ext4 -q /dev/loop0p1
完成

文件描述符与打开文件之间的关系

在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。
每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。具体情况要具体分析,要理解具体其概况如何,需要查看由内核维护的3个数据结构。
·进程级的文件描述符表
·系统级的打开文件描述符表
·文件系统的i-node表

文件描述符、打开的文件句柄以及i-node之间的关系

可以通过以下程序来查看文件描述符

使用系统调用实现 ls-l

三、问题与解决

1、文件描述符是什么,有什么作用吗?

解决:文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。
作用:1. 由于进程级文件描述符表的存在,不同的进程中会出现相同的文件描述符,它们可能指向同一个文件,也可能指向不同的文件 2. 两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。3. 要获取和修改打开的文件标志(例如:O_APPEND、O_NONBLOCK和O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作,其对作用域的约束与上一条颇为类似。4. 文件描述符标志(即,close-on-exec)为进程和文件描述符所私有。对这一标志的修改将不会影响同一进程或不同进程中的其他文件描述符

2、LINUX根磁盘分区满了怎么办?

删...
1.使用 df -h 命令查看磁盘使用情况
2.查看知道是磁盘使用满了之后从服务器根目录使用du -h --max-depth=1命令查找出占用空间最多的文件夹,输入命令:ls –lhS 将文件以从大到小顺序展现
3.rm –f 前确认下是否要下载下来让开发人员分析日志。
在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。
输入命令:/usr/sbin/lsof|grep deleted 确认删除文件是否被占用,占了就删

星光荡开宇宙
原文地址:https://www.cnblogs.com/pogbar/p/15389809.html