位置: 编程技术 - 正文

Unix文件系统和pwd命令实现详解(unix的文件系统采用)

编辑:rootadmin

推荐整理分享Unix文件系统和pwd命令实现详解(unix的文件系统采用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unix中文件系统采用,unix中文件系统采用,unix操作系统的文件系统,unix操作系统的文件系统,unix中的文件系统采用,unix操作系统的文件系统,unix的文件系统采用,unix操作系统的文件系统,内容如对您有帮助,希望把文章链接给更多的朋友!

1. 对于用户来讲Unix系统中硬盘上的文件组成一棵目录树。每个目录能包含文件和其他子目录。

目录树的深度几乎没有限制,当然如果你所创建的目录树太深,系统就会提醒超过范围,并停止执行,以下脚本经测试有效

while true

do

mkdir deep_well

cd deep_well

done

我运行了几秒后,中断系统提示超过目录树范围。

2. 一个磁盘可以划分为N多扇区,每个扇区有字节 。扇区是磁盘上的基本存储单元,我们可以将每个扇区进行编号,这样磁盘就变为

一系列编了号的块的组合。

3. 磁盘块上存储文件时,按照一定的规律。

每个文件系统分为3部分:超级块,i-节点表,数据区 。

超级块 :存放文件系统本身的信息,比如记录了每个区域的大小,或未被使用的磁盘块的信息。(不同版本稍有差别)

i-节点表 :每个文件都有其属性,大小,最近修改时间等等,这些被存储在ino_t 的结构体中,所有的i-节点都有一样的大小,i-节点表就是这样一些节点的列表。

(表中的每个i-节点都通过位置来标志,例如标志为2的i-节点位于文件系统i-节点表中的第3个位置 )

数据块 :存放文件内容,因为块的大小一定,所以有时一个文件会分布在多个磁盘上。

4. 创建一个文件的4个步骤:

存储属性:内核先找到一个空的i-节点,把文件的属性信息填入其中;

存储数据:从磁盘上找出空闲块,把文件数据复制进去;

记录分配情况:内核在i-节点的磁盘分布区记录了刚刚的磁盘编号

添加文件名到目录:将(i-节点号,文件名)添加到目录。

5. cat,more等一些命令的实现思想:

cat name

在目录中寻找文件名,

定位到相应文件名的i-节点号;

根据i-节点号里面获得文件属性,查看权限,若权限不够则open()函数返回1,打开失败,停止;

根据i-节点里面磁盘位置访问文件位置的数据块

一遍遍调用read读取数据(可以存放到缓冲区)

6. 大文件的存储

如果一个文件需要个编号的磁盘块来存储,但是i-节点值包含个项的分配链表,这时候,我们可以将前个放到i-节点里,其他4个放到一个数据块里面,在i-节点的第

位写上指向存那4个编号的块。则我们实际用了+4+1个数据块,那个多出来的叫:间接块 。

同理,间接块饱和时,我们可以设置二级间接块,,,

7. 文件在目录中的含义

目录包含(i-节点号,文件名)的入口,即目录包含的是文件的引用,每个应用称为链接。

8. 目录包含子目录的含义

目录包含指向子目录i-节点的链接。

9. 目录有个父目录的含义:

目录包含..的链接,即指向父目录。

. 文件没有名字只有i-节点号,但是链接可以有名字 ,一个文件可以有多个链接(他们的名字也可以不同,但是他们指向一个文件,对他们的操作就是对源文件的操作)

. Unix系统可以包含多个文件系统,每个文件系统都是一棵独立的树,都有根目录,但是系统可以将他们整合成一棵大树,即一个树的根装载到另一个数的某个节点上。mount

符号链接通过文件名引用文件,可以跨越文件系统,也可以指向目录。相当于windows中快捷方式。

硬链接是将目录链接到树的指针,同时也是将文件名和文件本身链接起来的指针。通过对i-节点号引用文件。

.与目录树相关的命令和系统调用

命令 mkdir

实现 头文件 #include <sys/stat.h> #include <sys/types.h>

函数原型 int res=mkdir (char *path,mode_t mode);

命令 rmdir 删除一个目录,这个目录必须是空的

实现 头文件#include <unistd.h>

函数原型int res=rmdir (const char* path);

命令 rm 减少相应i-节点连接数,若此时节点书减为0,就释放数据块和节点。不能用来删除目录

实现 头文件#include <unistd.h>

函数原型int res=unlink (const char *path);

命令 ln 不能用来生成目录的链接。

实现 头文件#include <unistd.h>

函数原型 int res=link (const char *old,const char *new);

命令 mv 删除原来的目录,复制到新的里面

实现 头文件#include <unistd.h>

函数原型int res=rename (const char* from,const char *to);

原理:复制链接到新的名字/位置再删除原来的链接

if(link("x","z")!=-1)

unlink("x");

命令 cd 对进程有影响,对目录本身没有影响

实现 头文件 #include <unistd.h>

函数原型 int res=chdir (const char *path);

. pwd 命令的实现

Unix文件系统和pwd命令实现详解(unix的文件系统采用)

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <dirent.h>

#include <string.h>

#include <unistd.h>

ino_t get_inode(char *);//get the inode number

void printpathto(ino_t);

void inum_to_name(ino_t,char *,int);//get the node name by its inode number

int main()

{

printpathto(get_inode("."));

putchar('n');

return 0;

}

void printpathto(ino_t this_inode)

{

ino_t my_inode;

char its_name[BUFSIZ];

if(get_inode("..")!=this_inode)

{

chdir(".."); //up one dir

inum_to_name(this_inode,its_name,BUFSIZ); //get its name

my_inode=get_inode(".");

printpathto(my_inode); //itorater

printf("/%s",its_name);

}

}

void inum_to_name(ino_t inode_to_find,char *namebuf,int buflen)

{

DIR *dir_ptr; //the directory

struct dirent *direntp; //each entry

dir_ptr=opendir(".");

if(dir_ptr==NULL)

{

perror(".");

return;

}

while((direntp=readdir(dir_ptr))!=NULL)

{

if(direntp->d_ino==inode_to_find)

{

strncpy(namebuf,direntp->d_name,buflen);

namebuf[buflen-1]='';

closedir(dir_ptr);

return;

}

}

fprintf(stderr,"error looking for inum %dn",(int)inode_to_find);

return;

}

ino_t get_inode(char *fname)

{

struct stat info;

if(stat(fname,&info)==-1)

{

fprintf(stderr,"Can not stat");

perror(fname);

return 1;

}

return info.st_ino;

}

运行结果:

caoli@caoli-laptop:~/workspace/test$ ./pwd1

/home/caoli/workspace/test

caoli@caoli-laptop:~/workspace/test$

FreeBSD下zfs: failed with error 6错误如何解决? 环境:重编译完内核,安装后重启,显示:zfs:failedwitherror6,然后就是mountroot提示了。这是一种很少见的zfs错误代码,一般2或居多。追踪:看最后一行

Freebsd PF 安装使用详解 FreebsdPF安装使用FreeBSD下的PFFreeBSD下的包过滤工具有IPFW,IPF以及PF,它们各有特点。PF原本是OpenBSD下的包过滤工具,FreeBSD开发人员已经把PF移植到了FreeBSD

FreeBSD如何添加硬盘?FreeBSD添加硬盘的方法 FreeBSD添加硬盘在平时的使用中,由于数据的增多,可能会出现单块磁盘不够用的情况。这时,就需要给FreeBSD再增加一块磁盘,分区,格式化,再将分区

标签: unix的文件系统采用

本文链接地址:https://www.jiuchutong.com/biancheng/350527.html 转载请保留说明!

上一篇:Unix中的dot命令详解(unix du)

下一篇: FreeBSD下zfs: failed with error 6错误如何解决?

  • 异地存货怎么审计
  • 企业所得税核定征收的条件
  • 工资个税计算公式2020
  • 全国税务师官网报名
  • 挂车和牵引车如何选
  • 租土地使用权建房
  • 国债利息属于免税吗
  • 每个月发工资扣个税扣的肉疼
  • 公司付给中间人居间费用如何纳税
  • 销项负数的分录怎么做
  • 未交增值税借方表示什么
  • 所得税的账务处理流程
  • 福利企业要求
  • 物业企业门禁卡如何记账?
  • 银行取现怎么取
  • 企业收到发要失控发票做进项税额转出如何做税务处理?
  • 建安业核定征收利润率
  • 学校需要开发票吗,学校的纳税人识别号是什么?
  • 案例讲解:当年度未及时取得有效凭证的相关成本、费用涉税处理
  • 餐饮发票可以抵扣成本吗
  • 金蝶账可以修改建账日期吗
  • 小规模企业增值税税率
  • 国际收款产生的手续费账务处理
  • 租金和物业费怎么计算
  • 预提厂房租金
  • 付了款没有收到发票
  • 车位销售代理合同
  • 增值税进项余额月末转吗
  • 怎样解除机房
  • 苹果6拍照如何
  • 出纳能不能兼开专票
  • 无票收入科目
  • 在php中,字符串有哪些表示形式
  • 计提本月应缴纳的所得税
  • 计提房租记什么科目
  • 固定资产前期购买的后期入账怎么入?
  • 银行罚息计入什么会计科目
  • php公众号推送完整示例
  • 企业类型变更是什么意思
  • 回迁房办理房产证契税怎么交
  • 如何开启framework 3.5
  • EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
  • 尚融宝盈(宁波)投资中心(有限合伙)
  • php显示错误报告方式
  • uniapp使用高德地图直接进行导航
  • 银行存款也有窍门
  • vue-cli(vue脚手架)超详细教程
  • uniapp和vue哪个好
  • 少收的应收款和应收账款
  • 每年结息一次,到期一次还本是单利
  • 企业收到工程款会计分录
  • 出口退税超期了怎么办
  • mysql 5.7.20 win64 安装及配置方法
  • 建筑公司计提企税怎么算
  • 最新外资企业法实施条例
  • 注册资本认缴到期
  • 计入其他综合收益的有哪些
  • 公司买的茶叶怎么入账
  • 个人所得税规定的免纳个人所得税的范围
  • 作业成本多用于直接成本的核算
  • 融资租赁取得的机器设备的账务处理
  • 工业用电交税怎么算
  • 意外伤害条件
  • 资产负债表日指的是什么
  • 我国开征股票交什么税
  • 用SQL脚本读取Excel中的sheet数量及名称的方法代码
  • sql存储过程实例有哪些
  • win8系统如何关机
  • ghost装机顺序
  • 在对linux系统中dir
  • linux服务器安全防护方案
  • 自动上传文件
  • 万向节锁到底是什么
  • 统计文件个数linux
  • 加密批处理代码
  • jquery删除table行
  • javascript+css3 实现动态按钮菜单特效
  • 用python做
  • 国税网站怎么登录进入
  • 上海税务局网上举报平台官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设