再现理想 发表于 2015-1-18 11:26:19

Linux编程之Linux初级I/O深析仓酷云

写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。以上是我学习Linux的心得体会,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。
能够说统统存储体系的基本是体系挪用:open,creat,seek,read,write,mmap...的使用,要想写个高功能FS,就要深切IO体系挪用.这篇博文次要剖析了操纵文件的内核数据布局的变更及相干tips,相干I/O基本操纵,这里不讲,请参阅APUE.
在linux内核中对一切翻开的文件利用了三种数据布局来暗示:
1)每一个历程在历程表中(PCB)中都有一个纪录项
1structtask_struct{2//...3structfile*filep;4//...5};如下面内核代码filep就是一张该历程翻开的文件形貌符表,能够当作一个数组,从0入手下手计数.当我们挪用open翻开一个文件时,形貌符会++1.
1intmain(){2intfd1;3fd1=open("./test",O_RDONLY,0);4printf("%dn",fd1);5return0;6}好比这段代码,open前往的是文件创立时前往的文件形貌符,在本机无别的翻开的文件时运转程序能够看到了局为:3.这里是3是有缘故原由的,由于0,1,2这三个文件形貌符已被OS内核占用失落了,顺次为STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO.以是文件形貌符从3入手下手计数,顺次下往,那有无最年夜限定呢?再用上面代码测试下:
01intmain(){02intfd1;03inti;04for(i=0;i<1025;i++){05fd1=open("./test",O_RDONLY,0);06printf("%dn",fd1);07}08getchar();09return0;10}假如你ulimit没做任何修正的话,在到1023后就会打印-1.这是文件形貌符凌驾了体系最年夜限定,可用ulimit-n举行响应调剂.
文件形貌符在内核中会存成如许:

2)一切翻开的文件有一张大众的文件表(被一切历程共享),包括一些文件读写标记(r,w...),文件地位,援用计数(由形貌符表指向的援用数),另有一个指向i-node表的指针.内核数据布局代码以下:
1structfile{2unsignedshortf_mode;//文件操纵形式3unsignedshortf_flags;//文件翻开和把持标记4unsignedshortf_count;//翻开文件的援用计数5structm_inode*f_inode;//对应i-node6off_tf_pos;//文件地位7};3)别的关于一切翻开的文件另有一张大众的i节点表(一切历程共享),内里有一切文件的元数据信息,好比文件巨细,文件一切者.
1structstat{2intst_size;3//...4};别的这边申明下,linux只要i-node没有v-node,v-node指的是UNIX.这里我们以用的较多的linux为例.
三个数据布局能够经由过程上面这张图接洽起来:

如今让我们依据下面的常识看下读取文件text的历程,当我们挪用open函数时会发生一其中断(软),linux内核实践挪用的是sys_open.
1staticinlinelongopen(constchar*file,intflag,intmode){2externlongsys_open(constchar*,int,int);3returnsys_open(file,flag,mode);4}挪用sys_open函数,以后历程会将task_struct中的文件structfile*filep;办理指针表与内核中的file_table(一切历程共享,后面说过)举行指针毗连,全部file_table能够当作一个数组,举行指针毗连的根据是找到ref=0的项.由于假如有哪项已有文件了,ref一定会>=1的,年夜于1是由于有共享好比fork.dup2之类的操纵.
filep和file_table援用操纵如图:

然后从硬盘读取text文件,猎取inode节点.这个历程次要依据用户传进的路径(绝对/相对)找到i-node,假如text是在一个多层目次下,好比~/a/text会先读取根目次的i节点然后失掉a的目次项再读取到a的i节点再失掉a文件下的目次文件再失掉text目次项最初失掉i-node.如图所示:

最初找到text文件的i-node节点后必要注册到file_table的布局体中.
以上是全部翻开文件的历程,我们来看下新建文件的历程,新建文件和翻开文件相似,不外这里和翻开文件分歧的是新建i节点的历程.创立文件选用creat函数时实在和open一样挪用的也是sys_open函数.只不外传参纷歧样了.O_CREAT|O_TRUNC.
1intsys_creat(constchar*pathname,intmode){2returnsys_open(pathname,O_CREAT|O_TRUNC.mode);3}我们间接举行创立i-node节点的中央,当以~/a/text路径查找text的i节点时,因为a这个数据布局中还没有text这个目次项,以是查找函数会前往空.不外这里要注重我们来挪用下内核代码看下:
1intopen_namei(intdfd,constchar*pathname,intflag,2intmode,structnameidata*nd){3//...4if(!(flag&O_CREAT)){5}6}代码中有O_CREAT的判别,以是此时是不会往找这个i-node而是会往创立文件.创立文件的内容会包括权限等判别.先往a文件中增加目次项,查找余暇目次项(ref=0,后面提到过),找到了就把目次项挂载到此地位处.目次项的名字为text.最初再把文件的i-node也载进file_table中,并依据这个inode天生一张i-node表,内里有此文件的一切元数据信息.到最初sys_open(实践挪用的是do_sys_open)操纵会前往文件形貌符fd.
1longdo_sys_open(constchar*filename,intflag,intmode){2//...3returnfd;4}全部文件创立历程停止.上面我们就能够拿着这个fd对它举行统统操纵(在有权限的局限内).好比写,读.
写操纵,内核数据布局块次要是要注重以后文件指针偏移量f_pos,这个会决意你写进的地位,良多时分,操纵文件I/O函数时,翻开了一个文件举行写进后,这个时分f_pos为文件最初的指针的地位巨细,而再用这个fd举行读取的话,会发明基本读取不了数据,不懂"行情"的人大概会烦闷了,实在缘故原由就在这里,这个是后你就必要挪用lseek函数把f_pos挪动到首位.再举行读取就能够了.
最初再来讲说文件封闭操纵close.我们挪用close时,实在并没有真正封闭,而是将后面说的file_table中的ref--.由于一个文件并非你一团体在利用,这也是file_table是一切历程共享的缘故原由.ref告知os有几历程在利用,当ref变成0了,也即OS要接纳的时分.OS会把一切ref=0的对应的i节点从内核i节点数据布局中删除.不成能让这些没有人利用的一向利用体系资本.

看不懂man文档的人.在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有.

飘飘悠悠 发表于 2015-1-21 06:35:32

一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通。

蒙在股里 发表于 2015-1-30 09:49:50

安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。

再现理想 发表于 2015-1-30 14:05:53

把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。

柔情似水 发表于 2015-1-31 18:31:54

对我们学习操作系统有很大的帮助,加深我们对OS的理解。?

金色的骷髅 发表于 2015-2-4 13:22:15

应对Linux的发展历史和特点有所了解,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具。

活着的死人 发表于 2015-2-4 20:39:30

把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。

小女巫 发表于 2015-2-5 11:54:02

首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。

莫相离 发表于 2015-2-9 22:52:17

Linux高手更具有鼓励新手的文化精神。如何在Linux社区获得帮助,需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问。

飘灵儿 发表于 2015-2-10 05:19:38

Linux?最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具,所以Linux操作系统有着广泛的应用空间。

小妖女 发表于 2015-2-18 05:01:14

再次,Linux是用C语言编写的,我们有学习C语言的基础,读程序和编写代码方面存在的困难小一点,也是我们能较快掌握的原因之一。?

愤怒的大鸟 发表于 2015-2-18 23:49:39

了解Linux的网络安全,系统的安全,用户的安全等。安全对于每位用户,管理员来说是非常重要的。

简单生活 发表于 2015-2-24 03:26:52

学习Linux,应该怎样学,主要学些什么,一位Linux热心学习者,一段学习Linux的风云经验,历时十二个小时的思考总结,近十位网络Linux学习者权威肯定,为您学习Linux指明方向。

山那边是海 发表于 2015-3-1 19:47:26

上课传授的不仅仅是知识,更重要的是一些道理,包括一些做人的道理,讲课时也抓住重点,循序渐进,让同学理解很快;更可贵的是不以你过去的成绩看问题.

第二个灵魂 发表于 2015-3-10 22:43:47

我学习Linux的心得体会 ,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。

若相依 发表于 2015-3-17 12:07:20

linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创!

精灵巫婆 发表于 2015-3-24 09:25:15

尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。
页: [1]
查看完整版本: Linux编程之Linux初级I/O深析仓酷云