操作系统实验六 文件系统验证实验

前言

当时由于假期的原因,我们不需要做实验五,所以实验六是我们做的最后一个实验,因此实验五就需要靠大家自己完成了。

1.实验目的

初步掌握Linux系统文件权限和IO操作。

2.实验内容

熟悉Linux系统文件权限和使用相关IO函数进行文件创建和读写操作

3.实验的内容

本实验包含文件权限观察、修改和使用IO函数进行文件创建、读写速度测量,仔细阅读第四部分内容,并根据第四部分内容完成下面操作:

  1. 通过chmod修改可执行文件的可执行权限(注:通常程序文件为可执行文件),并观察修改后对文件的影响。
  2. 通过umask观察对创建文件和目录默认权限影响,并通过修改umask值更改文件和目录创建时的默认权限并观察修改后重新创建文件和目录时访问权限所发生的变化。
  3. 使用open函数创建文件,观察使用和不使用第三个参数指定文件访问权限的区别。(注意打开一个文件后使用完毕需要使用close进行关闭,同时每次完成实验后使用rm删除函数所创建的文件,如果没有删除权限可以通过chmod修改权限后再删除
  4. 对文件进行读写操作,测量磁盘读写速度,单位可用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); //创建并打开文件,可读可写,创建权限为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, 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 // 缓冲区大小为100MB

double 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;
}

至此,我们的实验大功告成!如果大家有什么想法,可以在评论区提出,一起交流。

  • 37
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
文件系统是计算机操作系统中的一个重要组成部分,它为用户提供了管理文件和目录的接口,使得用户可以方便地存储和获取自己的数据。在Linux系统中,文件系统是由内核提供的,通过挂载的方式将其连接到用户空间。为了更好地理解文件系统的工作原理和实现方式,可以通过实验的方式来进行深入学习。下面我将介绍一下Linux下C语言实现文件系统实验实验分析。 实验目的: 通过本实验,可以了解文件系统的工作原理和实现方式,掌握文件系统的设计和实现方法,加深对文件系统的理解和应用。 实验内容: 1. 设计一个简单的文件系统,支持创建、删除、读取和写入文件,并能够管理文件和目录。 2. 使用C语言实现文件系统的各个模块,包括文件系统的格式化、文件和目录的创建、删除和管理等。 3. 在Linux系统上进行测试,验证文件系统的正确性和可靠性。 实验步骤: 1. 设计文件系统的数据结构和布局,包括超级块、inode表、目录项、数据块等。 2. 实现文件系统的格式化程序,将磁盘空间划分为固定大小的块,并初始化超级块和inode表。 3. 实现文件和目录的创建和删除程序,包括创建文件和目录、删除文件和目录等操作。 4. 实现文件和目录的读取和写入程序,包括从磁盘读取文件和目录数据、将数据写入到磁盘等操作。 5. 实现文件和目录的管理程序,包括查找文件和目录、更新文件和目录的属性等操作。 6. 编写测试程序,验证文件系统的正确性和可靠性,包括创建文件和目录、读取和写入文件、删除文件和目录等操作。 实验结果: 通过实验,可以实现一个简单的文件系统,支持基本的文件和目录操作,并能够在Linux系统上进行测试。实验结果可以验证文件系统的正确性和可靠性,同也可以加深对文件系统的理解和应用。 总结: Linux下C语言实现文件系统实验是一项非常有意义的实验,它可以帮助我们深入理解文件系统的工作原理和实现方式,掌握文件系统的设计和实现方法,加深对文件系统的理解和应用。通过实验,可以实现一个简单的文件系统验证其正确性和可靠性,并为后续研究和应用提供一定的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值