{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

Linux中“一切皆文件”是什么意思?

AlphaWalletAlphaWallet 回答0 收藏1
问题描述:听说linux下一切可执行程序是二进制文件?win的可执行程序不也是二进制文件吗?
收藏问题

4条回答

jeyhan

jeyhan

回答于2022-06-28 11:54

简单来说,posix的文件读写接口可以操作一切。

评论0 赞同0
  •  加载中...
crelaber

crelaber

回答于2022-06-28 11:54

这是个很古老的话题。Linux设计之初内核层和用户层是严格分离的,用户层要访问内核就要调用两个系统调用,read和write,比如访问串口,就是读写/dev/com设备,read接收数据,write发送数据,那么这个串口设备就相当于一个文件了。
后来随着硬件设备性能越来高,这种copy to user 的方式效率实在是有点捉襟见肘,就出现了内核内层直接map到用户空间的捷径,用户层可以zero copy方式访问内核数据,效率也就大大提升了。
所以现在的Linux对设备的访问并不是单纯的read write和ioctl,还有map方式,像著名的uio框架,就可以把内核内存映射到用户空间让应用程序直接读写。

评论0 赞同0
  •  加载中...
jemygraw

jemygraw

回答于2022-06-28 11:54

看了下这里的回答,本质上都没有回答到点子上。这个如果你做过一些底层系统维护工作,又或者做过点linux开发,就会理解了。

举两个例子,如何在linux中列举所以开启了的进程?除了系统api以外,其实你还可以ls一下/proc目录,那里每一个进程会对应一个文件夹,文件夹的名字是pid,在每个进程的文件夹下还会有这个进程的详细信息,比如cmdline文件指的是这个进程的启动命令和参数。再比如如何得到当前系统的硬件信息?你可以直接查看/dev目录,里面会分门别类地给到你所有硬件信息。而且很多都是可以直接当做txt文件打开的。系统会把很多硬件直接模拟成文件,这样你可以在没有具体系统api调用文档的情况下,通过读写文件来完成操作硬件。比如一些简单系统显示,就可以直接读写fbcon文件来完成,以及以前打印机,扫描仪等等的操作,就可以通过写入打印机文件,以及读取扫描仪文件来完成。

除了这些以外,因为是万物文件的系统,可以通过编写简单的编写各种shell,或者说类似于windows的bat文件来完成复杂的系统api操作,因为他们只是文件。举个例子,通过命令行可以直接裸写/dev/sda的二进制内容来完成分区和格式化工作。又比如mount命令本质上也是一种转换器,把硬件文件转换成分区文件夹。你对于分区内文件的操作,最后就变成了对硬件文件的操作,最后通过驱动变成实际的硬件指令。又比如我可以通过直接读写/dev内部的文件控制笔记本背板a面的呼吸灯颜色。

本质上,万物皆文件做的事情是,把你不熟悉的系统api,驱动,变成固定路径下的文件操作。这样你随便用任何一个编程语言和环境都可以驱动和控制系统表现。再比如你可以直接用nodejs,python,c,java,等等各种语言来裸写控制,而不用到处寻找各种支持库和系统包。这也是当初为什么类unix系统喜欢用管道的原因,因为都他妈的是文件操作,想怎么玩就怎么玩

评论0 赞同0
  •  加载中...
Eminjannn

Eminjannn

回答于2022-06-28 11:54

就是一切皆文件╮(╯_╰)╭

评论0 赞同0
  •  加载中...

相关问题

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<