操作系统实验六 文件系统验证实验
前言
当时由于假期的原因,我们不需要做实验五,所以实验六是我们做的最后一个实验,因此实验五就需要靠大家自己完成了。
1.实验目的
初步掌握Linux系统文件权限和IO操作。
2.实验内容
熟悉Linux系统文件权限和使用相关IO函数进行文件创建和读写操作
3.实验的内容
本实验包含文件权限观察、修改和使用IO函数进行文件创建、读写速度测量,仔细阅读第四部分内容,并根据第四部分内容完成下面操作:
- 通过chmod修改可执行文件的可执行权限(注:通常程序文件为可执行文件),并观察修改后对文件的影响。
- 通过umask观察对创建文件和目录默认权限影响,并通过修改umask值更改文件和目录创建时的默认权限并观察修改后重新创建文件和目录时访问权限所发生的变化。
- 使用open函数创建文件,观察使用和不使用第三个参数指定文件访问权限的区别。(注意打开一个文件后使用完毕需要使用close进行关闭,同时每次完成实验后使用rm删除函数所创建的文件,如果没有删除权限可以通过chmod修改权限后再删除)
- 对文件进行读写操作,测量磁盘读写速度,单位可用MB/s表示。测量方法:可以将缓冲区大小设为几百MB(通过malloc函数创建缓冲区),通过gettimeofday测量出读写所需时间并通过写入数据量除以时间获得读写速度。(由于大家用同一台机器可能测量的速度每次都会不一样,可以通过测量十次取均值和方差方式获得磁盘读写速度)。
4.实验过程
任务一:
先编译文件:
![]()
查看编译后文件的权限:

查看文件图标:

可以编辑:

运行文件:

进行文件权限的修改:(采用八进制数字模式对文件进行修改)
![]()
查看权限:
![]()
文件图标:

Vim权限不足:

运行可执行文件:
![]()
分析:在未修改权限之前,权限用二进制数字表示为775,此时该文件对于文件的拥有者是可读取、可写入、可执行的。因此,我们现在可以对这个可执行文件进行访问,修改(vim修改)、运行。接着,我们将权限修改成000,此时该文件对于文件的拥有者是不可读取、写入、执行的。因此,我们不可以对这个可执行文件进行访问,不可以修改(vim修改)、不可以运行。
任务二:
查看umask初值:
![]()
分析:
可以看到umask的初值为0002。
创建文件并查看它的默认权限:

分析:
可以看到创建的文件权限用二进制数字表示为110110100(rw-rw-r--),验算一下(位运算):110110110-010=110110100,确实是这样的!
创建目录并查看它的默认权限:
![]()
![]()
分析:
可以看到创建的目录权限用二进制数字表示为111111101(rwxrwxr-x),验算一下(位运算):111111111-010=111111101,确实如此!
修umask值:

分析:
将umask值修改为001,可以看到已经修改成功了。
创建文件并查看它的默认权限:

分析:
可以看到创建的文件权限用二进制数字表示为110110110(rw-rw-rw-),验算一下(位运算):110110110-001=110110110,确实是这样的!
创建目录并查看它的默认权限:
![]()
![]()
分析:
可以看到创建的目录权限用二进制数字表示为111111110(rwxrwxrw-),验算一下(位运算):111111111-001=111111110,确实如此!
任务三:
代码:

分析:
在这个代码中,我用open函数创建了两个文件,一个文件是用有第三个参数进行创建的,另一个文件则不使用第三个参数进行创建。最后再往文件写入一些内容。接下来我们来看看代码运行后的结果。
运行结果:

![]()
分析:
可以看到,使用第三个参数(644)生成的文件aFile的权限为rw-r--r--,用八进制数字表示确实为644。相反,不使用第三个参数生成的文件bFile的权限为---------,用八进制数字表示为000。因此,我们能得出结论:使用第三个参数生成的文件权限为第三个参数(八进制数字)对应的权限,不使用的话生成的文件的权限用八进制数字表示为000。
任务四:
代码:


分析:
根据自定义的大小(我这里定义的是100MB),我们创建一个文件并向文件中写入内容(创建的同时记录开始时间),然后关闭文件。接着我们对这个文件进行读取,读取完后记录结束时间。这样,我们就能得到一次读写所花费的时间和读写速度。为了答案精确,我进行了十次循环并取均值,最后得出了平均的读写速度。
运行结果:

分析:
通过观察结果,我们可以看到对于100MB的文件,磁盘的读写速度为775.76MB/s。
5.完整代码
任务三
//引用必要的头文件
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char *argv[])
{char filename1[] = "aFile"; //即将创建和打开的文件名char filename2[] = "bFile"; //即将创建和打开的文件名struct timeval startTime, endTime;char bufForReadWrite[] = "ContentToWrite";size_t bufSize = strlen(bufForReadWrite); //测量出读写缓冲区大小int fd; //用于存放open函数返回的文件描述符fd = open(filename1, O_RDWR | O_CREAT, 0644); //创建并打开文件,可读可写,创建权限为644if (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, filename1);close(fd); //写入完毕后关闭文件fd = open(filename2, O_RDWR | O_CREAT); //打开文件后的权限为可读可写if (fd < 0){//打开文件失败时返回perror("Unable to open file");return -1;}sizeWrited = write(fd, (void *)bufForReadWrite, bufSize);printf("Write:%ld bytes to %s\n", sizeWrited, filename2);close(fd); //读完毕后关闭文件return 0;
}
任务四
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>#define BUFFER_SIZE 100 * 1024 * 1024 // 缓冲区大小为100MBdouble measureDiskSpeed(const char *filename)
{// 创建缓冲区char *buffer = (char *)malloc(BUFFER_SIZE);if (buffer == NULL){printf("Failed to allocate memory for buffer.\n");return 0.0;}struct timeval startTime, endTime;double totalTime = 0.0;// 写入文件并测量时间for (int i = 0; i < 10; i++){gettimeofday(&startTime, NULL);int fd = open(filename, O_RDWR | O_CREAT, 0644);if (fd < 0){printf("Failed to open file for writing.\n");free(buffer);return 0.0;}ssize_t bytesWritten = write(fd, buffer, BUFFER_SIZE);if (bytesWritten != BUFFER_SIZE){printf("Failed to write to file.\n");close(fd);free(buffer);return 0.0;}close(fd);fd = open(filename, O_RDWR); //打开文件后的权限为可读可写if (fd < 0){//打开文件失败时返回perror("Unable to open file");return -1;}ssize_t sizeReaded = read(fd, buffer, BUFFER_SIZE);close(fd); //读完毕后关闭文件gettimeofday(&endTime, NULL);double elapsedTime = (double)(endTime.tv_sec - startTime.tv_sec) +(double)(endTime.tv_usec - startTime.tv_usec) / 1000000.0;double speed = (double)BUFFER_SIZE / (1024.0 * 1024.0 * elapsedTime); // 以MB/s为单位printf("第%d次读写花费的时间:%.2f s\n", i + 1, elapsedTime);printf("第%d次读写的速度:%.2f MB/s\n", i + 1, speed);totalTime += speed;remove(filename);}// 关闭文件和释放缓冲区free(buffer);// 返回平均速度return totalTime / 10.0;
}int main()
{const char *filename = "test.txt";double avgSpeed = measureDiskSpeed(filename);printf("平均读写速度: %.2f MB/s\n", avgSpeed);return 0;
}
至此,我们的实验大功告成!如果大家有什么想法,可以在评论区提出,一起交流。
相关文章:
操作系统实验六 文件系统验证实验
前言 当时由于假期的原因,我们不需要做实验五,所以实验六是我们做的最后一个实验,因此实验五就需要靠大家自己完成了。 1.实验目的 初步掌握Linux系统文件权限和IO操作。 2.实验内容 熟悉Linux系统文件权限和使用相关IO函数进行文件创建和…...
python中的循环控制语句break与continue
学习这两个语句之前,我们要先了解这两个语句是什么意思: break:中断、打破的意思。所以它的跳出循环的意思 continue:继续的意思,意思是跳过当前条件,继续循环 新需求来了!我们不仅要告诉 Py…...
C语言笔记23 •文件操作•
1.为什么要使用文件? 文件,顾名思义就是存储我们所写在电脑上的文本内容。如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序&#x…...
新项目来了,JDK 17和JDK 21 该如何选择?
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …...
友顺科技(UTC)分立器件与集成IC产品选型和应用
友顺科技股份有限公司成立于1990年,是全球领先的集成电路与功率半导体厂商 ,集团总部位于台北,生产基地位于福州、厦门。 友顺科技具有完整模拟组件产品线,其中类比IC涵盖各种稳压器、PWM控制IC, 放大器、比较器、逻辑IC、Voltage Translato…...
并发与多线程:创建多个线程,数据共享
数据共享问题分析 1. 只读的数据:安全稳定的,不需要特殊处理; 2. 又读又写的数据:2个线程写,8个线程读,写不好程序会崩。 c11并发于多线程_2章_4节_哔哩哔哩_bilibili...
【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码
资源地址:Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 完整代码分析 同时销售量后1000的sku品类占比中(不畅销产品)如上,精品类产品占比第一,达到66.7%,其次是香化类产品&#…...
LightGBM 进行回归建模的流程
LightGBM 进行回归建模的流程 文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有…...
【Linux】多进程基础--信号
文章目录 信号常见信号信号定时函数 信号 发生事件时通过信号向进程进行通知,在软件层次上模拟中断,也叫软件中断,处理优先级较高对于前台进程可以通过特殊的字符发送信号,例如CtrlC即给当前进程发送一个SIGINT中断信号。kill命令…...
若依项目部署(Linux2.0)
解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 配置Java环境变量: vim /etc/profile 设置环境变量生效: source /etc/profile 查看一下jdk版本: java -version 解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz 防火墙设置: …...
python小练习03
1.绘制奥运五环旗 #奥运五环的绘制 import turtle as t t.pensize(3) t.speed(0) def draw_circles():i0while i <4:args [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个…...
【机器学习】机器学习在深度学习领域中的作用:半监督学习的视角
👀时空之门👀 🔍引言🎈半监督学习概述🚝机器学习在深度学习领域中的作用☘特征提取与表示学习🍀复杂任务建模❀结合半监督学习提升性能 🚀半监督学习在深度学习中的应用场景📕图像识…...
C#WPF数字大屏项目实战01--开发环境与项目创建
1、学习目标 -界面布局 ,- 模板调整,- 控件封装,- 图表,- 通信对接,- 动态更新 2、开发环境 开发工具:Visual Studio-2022-17.8.6-Community 运行时框架:.Net 6或Framework 4.5以上 UI框…...
python中字符串的各类方法
大小写转换方法 upper() 用于将字符串中的小写字母转为大写字母。 abcd.upper() # ABCD aBcD.upper() # ABCD lower() 用于将字符串中的大写字母转为小写字母。 ABCD.lower() # abcd aBcD.lower() # abcd capitalize() 用于将字符串的第一个字母变成大写࿰…...
DataGrip 数据库连接客户端
I DataGrip 安装 1.1安装 打开dmg镜像,将“DataGrip.app”拖入应用程序中; 1.2 Act 打开应用程序,点击试用模式启动软件,然后将“jetbrains-agent-latest”拖到任意位置,然后拖入,弹出对话框,点击“Rest…...
JS片段:生成 UUID
Hi,这里是松桑,每天学习一个 JS 片段,涨涨🧀!今天带来的是如何生成 UUID,UUID作为全局唯一标识,使用常见广泛,包括分布式系统、数据库主键、会话标识、消息队列、日志追踪等等。 什么…...
小学数学出题器-Word插件-大珩助手
Word大珩助手是一款功能丰富的Office Word插件,旨在提高用户在处理文档时的效率。它具有多种实用的功能,能够帮助用户轻松修改、优化和管理Word文件,从而打造出专业而精美的文档。 【新功能】小学数学出题器 1、实现了难度设定;…...
短剧平台源码:打造个性化娱乐体验的核心功能
在数字化媒体的浪潮中,短剧平台源码扮演着至关重要的角色,它不仅是构建短剧平台的技术基础,更是提供个性化娱乐体验的关键。本文将深入探讨短剧平台源码的核心功能,包括推荐短剧、本周热门/热播、个性化推荐、追剧功能、观看历史、…...
【MySQL】MySQL 图形化界面 - 使用说明(MySQL Workbench)
一、安装软件 Navicat,SQLyog 这些软件都不错,不过都需要收费,当然也有破解版。下面用 MySQL Workbench,它是官方提供的工具。 二、使用操作 这个软件本质是一个客户端,现在要让数据库能够远程登录。不过一般不会远程…...
Shell 编程之免交互
一、Here Document 语法格式: 命令 << 标记 ...... ...... 标记 1.用wc -l的命令统计输入的文字的行数 [rootlocalhost ~]# wc -l <<EOF > aaa > bbb > ccc > EOF 3 备注: 显示行数。 2.整体赋值给变量,通过ech…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
