做封面的软件ps下载网站iis的网站登录没反应
做封面的软件ps下载网站,iis的网站登录没反应,手把手教你实现电商网站开发,河间做网站个人主页#xff1a;Lei宝啊
愿所有美好如期而遇 目录
你是否听过Linux下一切皆文件#xff1f;
在哪里我们体悟到了Linux下一切皆文件#xff1f;
文件是什么#xff1f;
在哪里体悟到的#xff1f;
常见疑惑
怎么办到的Linux下一切皆文件#xff1f;
我们抛出… 个人主页Lei宝啊
愿所有美好如期而遇 目录
你是否听过Linux下一切皆文件
在哪里我们体悟到了Linux下一切皆文件
文件是什么
在哪里体悟到的
常见疑惑
怎么办到的Linux下一切皆文件
我们抛出第一个问题C语言可以实现面向对象吗
第二个问题不同的硬件读写方法相同吗
第三个问题如何办到Linux下一切皆文件
我们最后整体梳理一下流程 你是否听过Linux下一切皆文件
刚开始学习Linux的时候我们从Linux的历史到学会使用指令入门Linux到Linux权限理解到gcc、make、vim、gdb、git等工具的使用到进程(进程理解进程创建进程终止进程等待进程替换)再到IO基础等等我们走过这样的一段路也许不止一次听过Linux下一切皆文件的说法也许没有听过这样的说法不过没关系接下来我们将会一步步去理解。
在哪里我们体悟到了Linux下一切皆文件
文件是什么
既然要说Linux下一切皆文件首先我们得明白什么是文件假如我们创建一个文件但是没有内容那么这个文件在磁盘占不占空间呢
答案是占空间的文件不仅仅只有内容还有属性我们在windows下可以看到文件的属性比如说创建时间文件大小位置等等所以我们应该知道文件 文件内容 文件属性。
第二个文件分成两种
磁盘文件(未被打开的)内存文件(被进程打开)
我们只要不使用文件那么文件就静静地躺在磁盘里也就是我们的磁盘文件但是你要是要访问文件使用文件 就得把文件加载进内存加载进去就没事了吗要是加载得多了没人管还了得所以要被操作系统管理建立struct file我们也叫他内存文件包含了磁盘文件的大部分属性以及几乎所有内容。
在哪里体悟到的
我们初学Linux时在命令行解释器下敲着一个又一个指令我们当时只知道ls哦这个指令敲进去回车当前工作目录下的所有文件都会显示出来ls -l再多显示个选项但是你问我指令是什么抱歉当时我们不知道。
现在再回头去看Linux下的指令都是C/C写的可执行程序可执行程序是什么? 不就是.exe文件所以指令也就是文件喽运行时在内存创建task_struct(进程控制块)将.exe文件的数据和代码加载进内存变成进程说到底都是被操作系统管理的文件。
那操作系统是个啥管理软硬件资源的软件也就是说操作系统也是可执行程序喽我们开机耗费的时间干啥了不就是将操作系统的可执行程序加载进内存吗就连操作系统本质上都是文件
理解了这些我们就会发现什么vim什么gcc都是可执行程序都是文件什么shell也是文件。
常见疑惑
但是有些问题我就不理解了你上面说的我都懂但是你说Linux下一切皆文件那好键盘是文件吗显示器是文件吗各种外设是文件吗外设明明是硬件你怎么能说是文件呢
stdinstdout我在学C语言的时候 常和我说stdin是标准输入他对应着键盘stdout是标准输出他对应着显示器那我问你
stdin是个啥stdout是个啥
这能难倒我嘛呵stdin和stdout不就是C标准库提供的变量吗类型是FILE*这多简单那我们接着往下看。
怎么办到的Linux下一切皆文件
首先我们得先理解stdinstdoutstderr(标准错误)是个啥他是FILE*类型的那是不是指向FILE类型FILE类型是什么他是个结构体既然是结构体里面就得封装变量那么封装了什么呢我们只提及两个
文件描述符fd缓冲区(两者详细参考Linux重定向原理由重定向原理贯穿讲解 进程、文件描述符及缓冲区这里不是重点不多说)
(点击看完蓝色字体的文章到这里当做你已经懂了stdin和stdout)现在我们懂了stdinstdout那怎么理解stdin对应着键盘stdout对应着显示器而且硬件怎么能被当成文件呢
我们从Linux的设计哲学来说原因就体现Linux操作系统的软件设计Linux是什么写的C语言。
我们抛出第一个问题C语言可以实现面向对象吗
我们从C这门面向对象的语言来看他之所以被叫做面向对象是不是因为有类的存在那么类包含了什么
成员属性成员方法
C语言的struct结构体可以包含成员方法吗当然是不能的但是没有别的办法了吗
当然有聪明的程序员们使用了函数指针去指向方法这就变相实现了面向对象 我们看图 第二个问题不同的硬件读写方法相同吗
显示器键盘网卡等等都是外设既然是外部设备那么就会有读写方式但是不同的外设他们的结构都不相同读写方法当然也就不会相同所以你显示器有你的readwrite方法我键盘自然也有我自己的readwrite方法。
所以不同硬件的readwrite方法的实现一定不同那么这些硬件的读写方法我们叫做什么呢硬件的驱动方法
所以我们有下图 第三个问题如何办到Linux下一切皆文件
我们说有一个文件我想读写首先他被加载进内存创建了struct file内存文件(这个文件里就包含了磁盘文件的几乎所有内容不仅仅是属性而且里面有对应外设的读写方法即驱动方法)接着将这个结构体的地址填入读写他的进程的files指向的files_struct里的fd_array[]中给open函数返回了fd然后有FILE封装fd给用户返回FILE*。
从此我们就可以对这个文件进行一系列操作了那么是什么时候我们把磁盘当做文件的或者说在哪个步骤我们用户忽略了硬件
是的就是在struct file创建的时候他一但创建返回了fd我们就可以找到他之后就可以调用他里面对应硬件的驱动方法去对文件做一系列操作。
也就是说因为struct file的存在不管是什么外设我们也不用管驱动方法是否相同我只需要找到你的struct file不管是向内核缓冲区写入(只谈一般情况)还是内核缓冲区里的数据要刷新到对应的硬件上那都不是我用户该操心的这都是你操作系统的事情因为struct file是你操作系统的内核数据结构关我用户什么事。
至此我们也就明白硬件其实一直都是硬件他当然不是文件只是我们通过一系列的软件设计让我们用户不再关心底层能够统一看待struct file内存文件对我们用户而言我不管你底层的东西对我用户而言我只要能找到struct file内存文件那么对硬件的读写就不是问题这是你操作系统该操心的我们用户的关心只停留在内存文件所以我们才说Linux下一切皆文件 我们最后整体梳理一下流程
用户调用fopenfopen封装了open系统调用open打开文件返回了fdFILE*-fileno fd给用户返回FILE*用户调用fwrite传入参数FILE*fwrite封装了write系统调用write传入参数FILE*-fileno操作系统执行write操作系统找到调用write的进程操作系统找到该进程中的struct files_struct *files根据files指针找到files_struct在files_struct中找到fd_array[]根据fd_array[FILE*-fileno]找到对应的struct file----------------------------------------------------------------操作系统执行struct file里的驱动方法操作系统...... 到这里我们关于Linux下一切皆文件全部讲解完如果觉得博主写的还可以点个关注我们下期再见。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88957.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!