实验描述:

通过在Linux系统上进行操作,会发现用户进程根本不关心文件系统的具体类型(更不关心硬件细节)。我们在Windows系统中常常看到C分区、D分区等。Linux系统用一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。 Linux 系统中的每个文件和目录都有访问许可权限,用它来确定谁能通过何种方式对文件和目录进行访问和操作。

本实训将介绍如何修改文件或者目录的属性,学习Linux文件系统中关于文件硬链接和软链接的概念和相关操作命令。

第一关:

本关任务:文件操作相关命令

#!/bin/bash
#------------------Begin-------------
mkdir -p MyDir
cp oldfile MyDir
cp -r ./Dir/*  ./MyDir
mv oldfile oldfile_bak
rm -r Dir
ls -al MyDir
#------------------End---------------

第二关:文件权限修改

Linux系统中的每个文件都有访问许可权限,文件的访问权限分为只读,只写和可执行三种。

只读权限表示只允许读其内容,而禁止对其做任何的更改操作。

只写权限表示允许修改文件的内容。

可执行权限表示允许将该文件作为一个程序执行。

Linux 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

只有文件所有者和超级用户可以修改文件或目录的权限。可以使用“绝对模式(八进制数字模式)”和 “符号模式”指定文件的权限。

在当前目录下输入ls -l可以看到如下的,第一大列列出了该目录下文件和目录的权限

chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。

例如,765将这样解释:

  • 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
  • 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
  • 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
#!/bin/bash
#---------------Begin--------------
chmod 664 oldfile1
chmod a+x oldfile2
chmod 761 oldfile3
#---------------End----------------

第三关:掩码

创建一个新的文件或者目录的时候,这些新的文件或目录都会有默认的访问权限,umask命令与文件和目录的默认访问权限有关。若用户创建一个文件,则文件的默认访问权限为 -rw-rw-rw- ,创建目录的默认权限 drwxrwxrwx ,而umask值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值。

获取系统的权限掩码

语法: umask

可以看到umask值为0022,其中第一个0与特殊权限有关,可以暂时不用理会.后三位022则与普通权限(rwx)有关,其中022中第一个0与用户(user)权限有关,表示从用户权限减0,也就是权限不变,所以文件的创建者的权限是默认权限(rw),第二个2与组权限(group)有关,表示从组的权限减2对应权限,所以需要从群组的默认权限rw减去2对应权限,则组用户的权限为rw-w=r。最后一位2则与系统中其他用户(others)的权限有关,由于w=2,所以需要从其他用户默认权限(rw)减去2对应权限,也就是去掉写(w)权限,则其他人的权限为rw - w = r,则创建文件的最终默认权限为 -rw-r--r-- 。同理,目录的默认权限为 drwxrwxrwx ,则d rwx rwx rwx - 022 = (d rwx rwx rwx) - (- --- -w- -w-) = d rwx r-x r-x,所以用户创建目录的默认访问权限为 drwxr-xr-x 。 umask -S

修改权限掩码使得:组用户仅拿掉可执行权限,其它用户拿掉写权限

可以看到新创建的文件为"drwxrw-r-x",新创建文件的权限变为"-rw-rw-r--"。这种方式并不能永久改变umask值,只是改变了当前会话的umask值,打开一个新的terminal输入umask命令,可以看到umask值仍是默认值。要想永久改变umask值,则可以修改shell配置文档,在文件中添加一行 umask 012 。

#!/bin/bash
#-------------Begin-----------
umask 0067
mkdir DirA
umask 0226
touch FileA
#-------------End-------------

第四关:软硬连接

文件数据

  • 用户数据(user data):记录文件真实内容的地方
  • 元数据(meta data):文件的附加属性,如文件大小、创建时间、所有者等信息

元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号类似身份证号)才是文件的唯一标识而非文件名(姓名)。系统或程序通过 inode 号寻找正确的文件数据块

为解决文件的共享使用,Linux 系统引入了两种链接:

  • 硬链接 (hard link)
  • 符号链接 (Symbolic link)

硬链接

硬链接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种链接就是硬链接。

语法: ln 源文件 目标文件

为文件file1 创建了硬链接hardfile,我们看到这两个文件的inode号都是34604356

从上图可以看出inode号为34604356的链接数为2

软链接

若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。 语法 ln -s 源文件 目标文件

从上图可以看出为file1创建了软连接syfile。可以看出软链接文件syfile和file1拥有不同的inode索引号,所以他们不是同一个文件,而syfile文件的数据内容是file1的路径。细心的同学可能看到,syfile的文件类型是"l",代表链接文件。

软硬链接的创建是为了实现共享,我们修改软硬链接文件的内容,是会修改原文件的内容的。请在Linux窗口练习,创建文件fileA,然后创建硬链接文件H_fileA,创建软链接文件S_fileA, 修改S_fileA的内容,相应的cat fileA或者cat H_fileA,发现内容也会改变。

补充树结构:

#!/bin/bash
#--------------Begin------------
mkdir a
cd a
touch d
touch e
cd ..
mkdir c
cd c
touch f
cd ..
ln -s ./c/f b
ln  ./a/e ./c/g#--------------End--------------

第五关:测量文件读写速度

Linux文件系统比较复杂,它通过上层的VFS层与用户交互,向下用匹配各种不同格式的磁盘文件系统。VFS隐藏了底层文件系统格式的差异,向上提供统一的文件系统抽象和操作行为。

前面的练习,我们进行过Linux的文件操作,会发现用户进程根本不关心文件系统的具体类型。假如执行一次文件拷贝 "cp /home/user/file1 /mnt/usb1/ppt2"命令,此处/mnt/usb1是NTFS文件系统格式U盘的安装点,而/home/user是ext2文件系统格式的移动硬盘目录。cp程序不知道这两个文件是属于不同的文件系统,却能通过与VFS交互而完成操作。

Linux系统中提供了一组函数(open、read、write、close)用于方便对文件进行创建、打开、读写和关闭操作。我们这里简单介绍open、read、write和close函数的使用。相关头文件、函数和介绍如下:

  1. #include <sys/stat.h>
  2. #include <fcntl.h>
  3. int open(const char *path, int oflag);
  4. int open(const char *path, int oflag, mode_t mode);

open函数打开path中所指定的文件名,可以使用绝对和相对路径两种方式打开文件,例如打开当前工作目录下的“aFile”文件,那么只需将“aFile”字符串的地址传入到open函数的第一个参数即可。第二个参数oflag指定文件打开的方式,我们可以传入只读读、只写、读写和创建等标志:O_RDONLY、O_WRONLY、O_RDWR和O_CREAT。更多标志请查阅函数相关文档。 我们注意到这里有两个open函数,它们第一个和第二个参数一致。第二个open函数第三个参数mode用于指定文件创建时的访问权限。当传入mode参数后,新创建文件的访问权限为mode&(~umask),即减去umask中对应权限后的mode中所描述的权限。当不传入第三个参数时,即使用只含有两个参数的open,新创建的文件访问权限由底层算法指定。 open函数在成功打开或创建path中所指定的文件后,将返回一个正整数值,这个数值我们称为文件描述符。我们可以通过文件描述符对所打开文件进行读写和关闭等操作。

  1. #include <unistd.h>
  2. ssize_t read(int fd, void *buf, size_t count);
  3. ssize_t write(int fd, const void *buf, size_t count);
  4. int close(int fd);

read、write和close函数都属于unistd.h头文件中。read函数可以使用open所返回的文件描述符对文件进行写入操作,其中第一个参数fd为open函数所返回的文件描述符,第二个参数buf为用于读取文件内容的缓冲区,第三个参数count为所读取内容的长度,以字节为单位。write函数同样第一个参数fd为open函数所返回的文件描述符,第二个参数buf为用于写入文件的缓冲区,第三个参数count为所写入内容的长度,以字节为单位。 在对文件进行操作完毕后,我们需要使用close函数对打开的文件进行关闭操作。close函数的参数为open所打开的文件描述符。 为了使大家更好的理解这几个函数的使用,我们给出下面一个简单的操作示例IODemo.c。

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char *argv[]){
char filename[] = "aFile"; //即将创建和打开的文件名
char bufForReadWrite[] = "ContentToWrite";
size_t bufSize = strlen(bufForReadWrite);//测量出读写缓冲区大小
int fd; //用于存放open函数返回的文件描述符fd = open(filename, O_RDWR | O_CREAT, 0644);//创建并打开文件,可读可写,创建权限为644
if(fd < 0){
//创建文件失败时返回
perror("Unable to create file");
return -1;
}
ssize_t sizeWrited=write(fd, (void *) bufForReadWrite, bufSize);
printf("Write:%ld bytes to %s\n", sizeWrited, filename);
close(fd); //写入完毕后关闭文件
//思考一下,如果没有重新open,直接读取,可以读到内容吗?也可以使用lseek函数,自己baidu
fd = open(filename, O_RDWR);//打开文件后的权限为可读可写
if(fd < 0){
//打开文件失败时返回
perror("Unable to open file");
return -1;
}
ssize_t sizeReaded=read(fd, (void *) bufForReadWrite, bufSize);
printf("Read:%ld bytes from %s, read content:%s\n", sizeWrited, filename, bufForReadWrite);
close(fd); //读完毕后关闭文件
return 0;
}

文件描述符

文件描述符:简称fd,当应用程序请求内核打开/新建一个文件时,内核会返回一个文件描述符用于对应这个打开/新建的文件,其fd本质上就是一个非负整数,读写文件也是需要使用这个文件描述符来指定待读写的文件的。 一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。 每个进程创建时就默认有三个文件描述符,0(stdin)、1(stdout)、2(stderr); 新创建的文件描述符就会依次是 3、4、5...;运行程序之后,可以在/proc/PID/fd目录下看到该进程的文件描述符。

实验代码:

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>int main(int argc, char* argv[])
{//请按要求补充代码
}

操作系统头歌实验四 文件系统相关推荐

  1. 头歌--实验四 蛮力法

    目录 第1关:百钱百鸡问题 第2关:数字迷 第3关:求3个数的最小公倍数 第4关:韩信点兵问题<

  2. Java头歌实验梳理

    Java头歌实验梳理 实验一:JAVA编程基础 编写一个简单Java程序,计算银行年存款的本息 编写程序完成矩阵的乘法运算 编写程序用*号输出等腰梯形 实验二:字符串 字符串的值转换成浮点型 字符转换 ...

  3. 手把手教你北邮操作系统小学期实验四——Linux Shell小型化1

    接上一章 手把手教你北邮操作系统小学期实验三--ARM/ucLinux-SkyEye的安装,配置与集成4 此实验是队友做的. 1. 实验目的: Shell 是一种 Linux 系统与用户的交互方式,是 ...

  4. AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台

    AlphaBeta剪枝算法求解博弈树最优选择 头歌实验平台 前言 一.AlphaBeta剪枝是什么? 1.由来, 最大最小决策树 2.发展 3. AlphaBeta剪枝 二.实验算法伪代码 三.实验算 ...

  5. 数据结构头歌实验梳理

    数据结构头歌实验梳理 实验一 算法表示与实现基础 1 数据交换 2 最大最小值问题 3 ADT-Complex 数据结构与算法 - 线性表 1 实现一个顺序存储的线性表 2 实现一个链接存储的线性表 ...

  6. 手把手教你北邮操作系统小学期实验四——Linux Shell小型化3

    接上一章 手把手教你北邮操作系统小学期实验四--Linux Shell小型化2 切换shell 查看全部shell:cat/etc/shells 切换shell chsh -s /bin/ash 切换 ...

  7. Linux操作系统实用功能,简单易操作 头歌实验一

    2022头歌平台操作系统实验一 实验(1):Linux操作系统基本使用 实验(2):Linux之C编程入门 文章目录 2022头歌平台操作系统实验一 前言 一.Linux操作系统基本使用 二.C编程入 ...

  8. 吉林大学操作系统上机(实验四:文件系统——Hash结构文件)

    实验四:文件系统--Hash结构文件 实验目的 1.理解Linux文件系统的内部技术,掌握Linux与文件有关的系统调用命令,并在此基础上建立面向随机检索的hash结构文件. 2.Linux系统保持U ...

  9. 【头歌实验】四、Python分支结构

    文章目录 >>>第1关:判断闰年 任务描述 案例分析 相关知识 条件表达式 分支语句 测试说明 参考答案 >>>第2关:计算快递费用 任务描述 案例分析 相关知识 ...

最新文章

  1. 2022年跨境电商的风口还在吗?
  2. boost::spirit模块实现罗马数字解析器的测试程序
  3. Thinkphp 配置不用输入index.php
  4. 腾讯地图 添加事件和移除事件
  5. python三菱_三菱机器人melfarxm.ocx控件的Python使用,MelfaRxMOCX,python,用法
  6. java怎么生成字母_在Java中生成字母序列
  7. C语言、指针的指针和野指针的问题
  8. 64位ubuntu能安装mysql数据库_Ubuntu操作系统下安装MySQL数据库的方法
  9. Julia :vscode jupyter中更新Julia kernel版本
  10. 基于SSM的智慧房屋租赁系统
  11. 婚恋职场人格-张晓文-武汉理工大学-中国MOOC-亲密关系测试题参考答案
  12. html5 3d背景墙,3D背景墙的价格怎样?3D背景墙的介绍?
  13. VTK_Learning_交互与拾取_单位拾取
  14. ios在判断设备是ipad_识别您的 iPad 机型
  15. Harbor: Harbor卸载安装及基本使用教程
  16. 程序员就该加班?5点半下班的程序员什么感觉
  17. 修改Android手机内核,绕过反调试
  18. switchhosts工具
  19. 空姐遇害案滴滴司机父亲:没有赔偿能力现在想上诉
  20. repeater的使用方法详解

热门文章

  1. 使用Tensorflow Object Detection API对集装箱号进行OCR识别
  2. 20221222 Coppeliasim的视频导出功能
  3. 浅谈AM5728裸板调试
  4. 数字漫画行业繁花似锦,国漫扎根本土文化“向外生长”?
  5. Linux的使用及软件安装
  6. Python爬虫-selenium爬取网易云歌单
  7. Lenovo X61鸟枪换炮之更换大硬盘
  8. eclipse的plugins导入hadoop-eclipse-plugin-2.6.0.jar后Preference下没有hadoop Map/Reduce的解决方法
  9. AEJoy —— 详解 AE 如何将 png 序列帧导出为 SVGA 动画文件
  10. Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx