我在学习操作系统这门课程的时候,课本说用户第一次请求对某文件进行操作时,须先利用open系统调用将该文件打开,这个我明白,open之后会从根目录开始,把目录一级级调入内存,查找到对应的目录项后就能找到对应的文件物理存放地址。
对此我的疑问是:在linux环境下,比如我双击桌面上的一个文件夹(目录),目录里面会显示FCB,然后再找到一个目录后再双击打开,一层层,这些动作是通过open还是opendir系统调用打开?目录是一种特殊的文件,所以它会怎么选择呢?有点分不清楚。其次,如果双击打开文件夹这一操作使用的是opendir,它一级级把目录调入内存,到最后一步时,依然要面对一个文件,那是不是又要使用open系统调用。求赐教。
文件是linux的基础,文件夹也是一种特殊的文件,这个你是知道的。所有文件打开的基本函数是open(),open()函数打开一个文件(含目录)后,会得到这个文件的属性,从这个属性中可以知道,这个文件是一个目录还是一个真正的文件。
而opendir()函数只能打开一个目录,也就是说,传给opendir()函数的参数必须是一个目录,这样才能正确的打开,否则就会失败。
open()函数则没有这个限制,只要参数传入的文件(或目录)存在,且有权限,就能正确打开。
所以,open()函数是更通用的,opendir()函数则一般在确定是打开目录的时候才会使用。
比如,你的电脑上有个/home/test/目录,那么你可以直接使用opendir()函数来打开,这样能使得代码更有阅读性,通过字面含义就能让你知道,你这里就是要打开一个目录。而open()函数的阅读性就会差一些,通过这个函数,你无法明确的知道你想要打开的是一个目录还是一个文件。
open()系统调用是用于打开文件的通用接口,不仅适用于普通文件,也适用于目录。所以,无论是打开文件还是目录,都可以使用open()系统调用。
双击打开文件夹(目录)时,系统会使用opendir()函数打开目录,并将目录的内容读取到内存中;
双击打开文件时,系统会使用open()系统调用来打开文件。
这是两个概念,open是系统方法,是底层的实现方式,双击是ui操作,ui界面和其点击操作需要开发编程实现。开发调用系统的方法实现文件或者文件夹的打开,就包含调用open、opendir等方法进行功能逻辑的实现。
open之后会从根目录开始,把目录一级级调入内存,查找到对应的目录项后就能找到对应的文件物理存放地址。
这个说法就是错的,open不会把目录调进内存,也不是用来找文件物理地址的。