文件系统实验(操作系统)

文件系统实验

【预备知识】

1.文件系统的文件类型

为了便于用户利用终端进行输入和输出,UNIX系统做了专门安排。UNIX系统自动为用户打开3个文件:标准输入、标准输出和标准错误输出文件,文件描述符分别为0、1、2,缺省时,这些文件是重定向到终端的。

LINUX系统问价有如下的分类

文件类型

S_IFREG

普通文件

S_IFDIR

目录文件

S_IFCHR

字符设备文件

S_IFBLK

块设备文件

S_IFIFO

有名管道文件

S_IFLNK

符号链接文件

S_IFSOCK

网络套接字文件

普通文件、目录文件、符号链接文件、有名管道文件、字符设备和块设备文件等。文件的分类主要由其I节点中的i_mode给出。为了能够检查每个文件的类型,Linux系统在sys/stat.h中定于了文件类型struct stat,并用宏定义来解决文件的类型,每个宏的参数就是结构stat中的st_mode的值。表1给出sys/stat.h中定义的文件类型的宏:

Linux系统在sys/stat.h中定义了文件类型struct stat,其定义如下:

1  

struct stat

{

dev_t st_dev; /*文件所在设备;主次设备号*/

ino_t st_into; /*inode*/

mode_t st_mode; /*protection  mode*/

nlink_t st_nlink; /*number of hard links*/

uid_t st_uid; /*user ID of owner*/

gid_t st_gid; /*group ID of ower*/

dev_t st_rdev; /*device type(if inode device)*/

off_t st_size; /*total size, in bytes*/

blksize_t st_blksize; /*blocksize for filesystem I/O*/

blkcnt_t st_blocks; /*number of blocks allocated*/

time_t st_atime; /*time of last access*/

time_t st_mtime; /*time of last modification*/

time_t st_ctime;   /*time of last change*/

}

2.文件系统的有关系统调用

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char * file_name,struct stat * buf);

int fstat(int filedes,struct stat*buf);

int lsrant(const char * name,struct stat * buf);

这些函数返回有关指定文件的信息。使用这些命令,不需要对文件有任何权限,只需要对指定目录有检索权限。

stat()函数统计由文件名指定的文件信息,并填充到以steuct stat为结构的buf中;

lstat()函数与stat()函数功能一样,只是仅仅统计文件的符号链接时有所不同。

fstat()函数与stat()函数功能一样,只是仅仅统计被打开的文件的类型。

3.创建新文件creat()

LINUX系统把所有文件都看成无结构的字符流式的文件,如果特定的应用中使用了某种类型的数据结构,只能由程序员对数据增加相应的结构。这样使得UNIX对文件的接口变得特别简单。

创建一个新文件要使用如下的语句序列:

#include<sys/ types.h >

#include<sys/ stat.h >

#include<sys/ fcntl.h >

Int open(const char * pathname ,int oflg[,mode_t mode]);

返回值:如果正确创建,返回文件的描述符;否则返回-1。

pathname是要创建文件的路径名。创建文件时,文件只能以只写方式打开,mode用来规定该文件的拥有者,小组用户及其他用户的访问权限。要求用按位逻辑加对下列符号常量(这些符号常量定义在sys/stat.h中)进行所需的组合;

S_IRUSR /*文件拥有者的读权限位,即0400*/

S_IWUSR /*文件拥有者的写权限位,即0*200*/

S_IXUSR /*文件拥有者的执行权限位,即0100*/

S_IRGRP /*小组用户的读权限位,即0040*/

S_WGRP /*小组用户的写权限位,即0200*/

S_IXGRP /*小组用户的执行权限位,即0010*/

S_IROTH /*其他用户的读权限位,即0004*/

S_IWOTH/*其他用户的写权限位,即0002*/

S_IXOTH /*其他用户的执行权限位,即0001*/

3个有用的按位加组合定义如下:

S_IRWXU定义为(S_IRUSR|S_IWUSR|S_IXUSR)/*即0700*/

S_IRWXG定义为(S_IRGRP|S_IWGRP|S_IXGRP)/*即0070*/

S_IRWXO定义为(S_IROTH|S_IWOTH|S_IXOTH)/*即0007*/

创建文件时,若文件已经存在,只要执行进程对文件所在目录有执行权,并对该文件有写权,系统使原文件的长度置0,释放文件占用的磁盘块,同时保持原文件的mode不变。

4.删除文件unlink() 

一个文件可以有多个路径,也即一个inode可能链接多个文件的目录项。系统调用unlink()的作用就是删除指定的目录项。也即将inode中的链接计数nlink减1.若链接计数减1后为0,且无进程正在使用,立即删除该文件(即释放文件的目录项,inode和文件占用的磁盘块),此后,文件不再存在;若链接计数减1后为0,且有进程正在使用,则立即返回,等进程使用完后,再删除;若链接计数减1后不为0,则立即返回。

5.打开文件open()

打开文件使用和creat()相同的头文件序列;

#include<sys/ types.h >

#include<sys/ stat.h >

#include<sys/ fcntl.h >

Int open(const char * pathname ,int oflg[,mode_t mode]);

返回值:如果正确打开,返回文件的描述符;否则返回-1.

其中,参数pathname是待打开的文件路径名;参数oflg规定了打开文件方法;仅当打开的文件不存在,需创建时,才使用mode这个参数规定文件的拥有者、小组用户、其他用户对新文件的访问方式。参数oflg可能的取值为下列3个值之一;

O_RDONLY : 以只读方法打开;

O_WRONLY:以只写方法打开;

O_RDWR;以读写方法打开。

该系统调用还允许将oflg与下列标志值进行按位逻辑加,以扩充其功能;

O_APPEND;当为(O_WRONLY | O_APPEND)时,打开文件允许向文件尾追加写;否则为覆盖写,即从文件头写。

O_CREAT;当为(O_WRONLY | O_CREAT)时,若打开的文件不存在,则创建文件,且必须带有参数mode,以规定文件的拥有者、小组用户、其他用户对新文件的访问方式。

O_EXCL;当为(O_WRONLY | O_CREAT | EXCL)时,若打开的文件不存在,则创建文件,且必须带有参数mode,以规定文件的拥有者、小组用户、其他用户对新文件的访问方式。当打开的文件存在时,则出错。使用这个参数可用来检查文件是否已经存在。

O_TRUNC;当为(O_RDWR | O_TRUNC) 或(O_WRONLY | O_TRUNC)时,将文件的长度截成0,文件的属性不变。

O_SYNC:文件以同步方式打开。若文件以同步方式打开时,进程每次进行write()调用时,都立即修改文件,即进程等待write()调用完成后才能继续执行。

6.文件关闭close()

文件关闭的系统调用格式如下:

# include <unistd.h>

int close( int fd);

其中,fd为文件的文件描述符。

返回值:成功时为0,失败时为-1.

7.读文件read()和写文件write()

任何文件在读写之前,必须先打开。文件被成功打开时,返回文件的描述符。只要文件是用O_RDONLY或O_RDWR或O_WRONLY标志打开,就可以用read()或write()系统调用从文件中读或向文件中写若干字节。这两个系统调用可能使用的语句序列如下:

# include <unistd.h>

ssize_t read( int fd, void * buf, size_t nbytes);

ssize_t write( int fd, conts void * buf, size_t nbytes);

返回:正确是为0或读写的字节数;错误时为-1.

其中,fd为文件的描述符,buf为读出货写入文件数据的字节数组,第三个参数是要传送的字节个数。例如:

Internet fd,n,nread,nwrite;

char buf[size];

nread=read(fd,buf,n)

nwrite=write(fd,buf,n);

进行读时,nread为读函数执行完后返回的字节数。返回的字节数可以少于要求读的字节数。当文件为终端时,一般read只读到下一个换行符为止。通常要少于请求的字节数。当返回值为0时,表明文件结束。-1表明出现了错误。如果文件尺寸不是buf的整倍数,某次read命令将返回一个较小的数,这一数即为write命令写入的字节数;下一次调用read时,将返回0。

进程写时,返回值为实际写的字节数;如果返回值与实际写的字节数不相等时,则出现错误。

磁盘缓冲块尺寸为512字节或1024字节(可参看stdio.h中的定义)。

7.文件的随机存取lseek(int fd,long off,int sbase)

#include<unistd.h>

#include<sys/types.h>

Int lseek(int fd,long off,int sbase);

Sbase的可能取值对文件读写指针的影响如下:

SEEK_SET=0,文件的读写指针置为off;

SEEK_CUR=1,文件的读写指针置为off+当前文件的读写

编程实现例<一>

【任务】

利用表1给出的宏来检查给定文件的类型。

【程序】

#include <sys/types.h>#include <sys/stat.h>#include “unistd.h”int main(int argc,char * argv[]){int I;struct stat bf;char * ptr;for (i=1,i<argc;i++){printf(“%s:”,argv[i]);if (lstat(argv[i],&bf)<0)//统计符号链接本身的信息{printf(“lstat error”);Continue;}If  ((S_IFMT & bf.st_mode)==S_IFREG)Ptr=“regular”;/*else if ((S_IFMT&bf.st_mode)==S_IFDIR)Ptr=“directory”;else if ((S_IFMT&bf.st_mode)==S_IFCHR)Ptr=“character special device”;else if ((S_IFMT&bf.st_mode)==S_IFBLK)Ptr=“block special device”;else if ((S_IFMT&bf.st_mode)==S_IFFIFO)Ptr=“pipe special file”;*/ElsePtr=“****unknown file mode***”;Printf(“%s:\n”,ptr);}Exit(0);}
修改后代码:

【运行结果】

编程实现例<二>

【任务】

cat命令的简单实现,完成从键盘复制到终端显示器。

【程序】

# include <unistd.h># define SIZE 512main(){char buf[SIZE];int n;while((n = read(0,buf,sise of buf))>0)write(1,buf,n);exit(0);}

修改后代码:

【运行结果】

【分析】

编程实现例<三>

【任务】

open和create系统调用的使用。一个用C语言的复制文件的例子。

【程序】

#include <stdio.h>#include <sys/types.h>#defin PERM 0644   /*rw for owner,r for group and other*/char * progname;main(argc,argv)int argcchar * argv[];{int f1,f2,n;char buf[BUFSIZ];progname = argv[0];if (argc! = 3)printf(“Usage:%s from to”,progname);if(f1 = open(argv[1],0)==-1)printf(“can’t open %s”, argv[1]);if((f2=creat(argv[2],PERM)—1)printf(“can’t creat %s”,argv[2]);while((n=read(f1,buf,BUFSIZ))>0)if (write(f2,buf,n)! =n)printf(“write error”,(char  * )0);close(f1);close(f2);exit(0);}

修改后代码:

【运行结果】

编程实现例<>

【任务】

请编写一个程序,采用随机读写文件的系统调用,从文件的某个位置开始对文件进行读或写。

【程序】

#include<unistd.h>#include<sys/types.h>Main(int argc,char * argv[]){If((fd=open(argv[1],O_RDONLY))==-1)exit(1);lseek(fd,184L,0);where=lseek(fd,0L,1);printf(“NOW new pointer value is %d.\n”,where);while((where=read(fd,&cl,1==1){printf(“ %c,”,cl);}Printf(“.\n”);}
修改后代码:

【运行结果】

总结:

   在实验中,我利用代码模拟了文件系统的基本操作,包括文件的创建、打开、读写、关闭和删除等。通过深入使用系统调用,如open、read、write、close等,我得以深刻体验到Linux内核与文件系统之间的交互过程。这一过程中,我不仅了解到了这些基本操作在内核中的实现细节,还感受到了Linux系统对于文件管理的严谨性和高效性。在文件随机访问的实验环节,我使用lseek系统调用来移动文件指针,从而实现了对文件任意位置的读写操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言实现五子棋教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

BFS 1块、算多少次

目录 1.矩阵内部的1块 2.从1开始&#xff0c;1或乘2&#xff0c;计算要多少次达到n 3.迷宫路径 1.矩阵内部的1块 #include <iostream> #include <vector> #include <cmath> #include <string> #include <cstring> #include <queue> usi…

警惕!新增4本SCI/SSCI被剔除!6月WOS更新(附下载)

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

入侵检测系统(IDS)

入侵检测 入侵检测&#xff08;Intrusion Detection&#xff09;是指发现或确定入侵行为存在或出现的动作&#xff0c;也就是发现、跟踪并记录计算机系统或计算机网络中的非授权行为&#xff0c;或发现并调查系统中可能为视图入侵或病毒感染所带来的异常活动。 入侵检测系统 …

neo4j 3.5.5版本创建新的数据库

neo4j 3.5.5版本创建新的数据库 1.找到neo4j的conf文件 点进去 2.点击neo4j.conf 选择记事本打开 3.把graph.db换成自己想要创建的数据库名称 4.打开neo4j服务 出现新的数据库

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败 解决方法&#xff1a; 首先%oracle_home%/network/admin下的sqlnet.ora文件&#xff0c;把SQLNET.AUTHENTICATION_SERVICES (NTS)加个 # 注释掉就好了

不收费的视频转文字软件有那些?4款视频转文字工具让你效率翻倍!

​视频转文字&#xff0c;也称为视频字幕生成或视频语音识别&#xff0c;是一种将视频中的语音内容转换成文字的技术。视频转文字真的不同的人群所用的工具有所差异&#xff01; 以下是三款免费的在线视频转文字工具推荐&#xff1a; 1&#xff1a;剪映 主要针对人视频制作人…

移植案例与原理 - XTS子系统之应用兼容性测试套件(1)

本文主要通过实例分析下ACTS应用兼容性测试套件移植案例&#xff0c;以及移植过程中特定的操作的原理。主要讲述的是轻量系统兼容性测试。轻量系统因系统能力限制&#xff0c;兼容性测试在系统初始化阶段进行&#xff1b;并且各设备烧录工具存在差异&#xff0c;导致自动化工具…

第二证券股市资讯:昨夜!全球新“股王”诞生

昨晚&#xff0c;英伟达成全球市值榜首公司。 当地时间6月18日&#xff0c;美股三大指数小幅收高&#xff0c;标普500指数与纳指再创前史新高。标普500指数涨0.25%&#xff0c;道指涨0.15%&#xff0c;纳指涨0.03%。 AI热潮推动英伟达大涨&#xff0c;市值逾越微软、苹果&…

【实战】Spring Cloud Stream 3.1+整合Kafka

文章目录 前言新版版本优势实战演示增加maven依赖增加applicaiton.yaml配置新增Kafka通道消费者新增发送消息的接口 实战测试postman发送一个正常的消息postman发送异常消息 前言 之前我们已经整合过Spring Cloud Stream 3.0版本与Kafka、RabbitMQ中间件&#xff0c;简直不要太…

华为鸿蒙 使用router跳转页面 和 router.getParams接收参数并使用参数 [最简单 最直接 的详细教程 ]

1, 准备两个页面 1. pages/DetailPage.ets 2. pages/Index.ets 2, 代码直接 cv 页面 // pages/Index.ets import router from ohos.router// 参数类型 class User {name: stringage: number }Entry Component struct Index {// 要传的参数Stateuser: User {name: John,…

【解决方案】Java 互联网项目中消息通知系统的设计与实现

前言 消息通知系统&#xff08;notification-system&#xff09;作为一个独立的微服务&#xff0c;完整地负责了 App 端内所有消息通知相关的后端功能实现。该系统既需要与文章系统、订单系统、会员系统等相关联&#xff0c;也需要和其它业务系统相关联&#xff0c;是一个偏底层…

docker-compose设置永久启动、自动重启

步骤一 找到 docker-compose.yml 文件 步骤二 vim 打开文件 找到 image: PS&#xff1a;就是为了对齐格式 步骤三 在其下方添加&#xff1a; restart: always而后保存即可

注意力机制简介

为了减少计算复杂度&#xff0c;通过借鉴生物神经网络的一些机制&#xff0c;我们引入了局部连接、权重共享以及汇聚操作来简化神经网络结构。神经网络中可以存储的信息量称为网络容量。一般来讲&#xff0c;利用一组神经元来存储信息的容量和神经元的数量以及网络的复杂度成正…

表面声波滤波器——工艺 (5)

制作工艺流程 声表面波器件制作采用半导体集成电路的平面工艺,首先在压电衬底上通过光刻、镀膜、剥离或刻蚀等工艺制备出叉指换能器&#xff0c;然后经过划片、粘片、压丝、封焊等后续封装工艺得到最后的器件。 整个工艺过程中需要操作使用各种机台 清洗机光刻机涂胶显影台全…

专业和学校到底怎么选,兴趣和知名度到底哪个重要?

前言 2024高考已经落下帷幕&#xff0c;再过不久就到了激动人心的查分和填报志愿的时刻&#xff0c;在那天到来&#xff0c;小伙伴们就要根据自己的分数选取院校和专业&#xff0c;接下来我就以参加22年(破防年)河南高考的大二生来讲述一下我自己对于如何选取院校和专业的看法以…

香港电讯高可用网络助力企业变革金融计算

客户背景 客户是一家金融行业知名的量化私募对冲基金公司&#xff0c;专注于股票、期权、期货、债券等主要投资市场&#xff0c;在量化私募管理深耕多年&#xff0c;目前资管规模已达数百亿级&#xff0c;在国内多个城市均设有办公地点。 客户需求 由于客户业务倚重量化技术…

从“野人饭”走红,探索品牌户外化营销趋势丨小红书内容分析

wildeat&#xff0c;户外是人的天性的回归 近来&#xff0c;“wildeat&#xff08;户外野吃&#xff09;”的风潮在小红书逐渐兴起。越来越多的人选择到户外吃一顿&#xff0c;做一次“野人”&#xff0c;主打一个只要氛围到了&#xff0c;就地开饭&#xff0c;不愁吃什么&…

屏蔽房是做什么用的?为什么需要定期检测?

屏蔽房对于不了解的人来说&#xff0c;可能光看名字不知道是做什么的&#xff0c;但是对于一些企业或者机构&#xff0c;却是再熟悉不过的了。和名字一样&#xff0c;屏蔽房是对空间内的信号以及一些外界环境条件进行隔绝&#xff0c;在一些有特殊要求的企业机构中&#xff0c;…

睿治数据治理平台焕新升级,推出全新建模与调度平台

在数据治理的浩瀚征途中&#xff0c;企业常常面临着数据冗余如同连绵山峦&#xff0c;使得关键信息的获取变得困难重重&#xff1b;在数据检索的海洋中&#xff0c;有时迷失方向&#xff0c;消耗大量时间精力&#xff0c;严重影响了运营效率&#xff1b;特别是在处理大规模数据…