4.18 mkfifo
文件:mkfifo.c

处理:这个函数试图在文件系统下的创建一个先进先出节点。该函数基于~mknod()~函数。

开发注释:见~mknod()~函数的开发注释。

4.19 mknod
文件:mknod.c

处理:
此函数允许在文件系统下创建以下类型的节点:

  •  目录;
  •  普通文件;
  •  字符设备;
  •  块设备;
  •  FIFOS。



截至目前,试图创建一个~FIFO~会使调用函数得到一个~ENOTSUP~的错误。
此例程基于文件系统的特定函数~evalformake()~函数和~mknod()~函数。
一个新文件系统必须包含自己的~evalformake()~和~mknod()~函数,以支持通用的~mknod()~函数。
在此条件下的通用~mknod()~函数支持其他文件系统类型而不必进行任何修改。

开发注释:
测试节点的类型,测试过程类似以下的代码:

    if ( (mode & S_IFDIR) = = S_IFDIR) ||
         (mode & S_IFREG) = = S_IFREG) ||
         (mode & S_IFCHR) = = S_IFCHR) ||
         (mode & S_IFBLK) = = S_IFBLK) ||
         (mode & S_IFIFO) = = S_IFIFO))
        Set_errno_and_return_minus_one (EINVAL);


其中:

  •  S_IFREG (0100000):创建一个正常的文件;
  •  S_IFCHR (0020000):创建一个字符设备;
  •  S_IFBLK (0060000):创建一个块设备;
  •  S_IFIFO (0010000):创建一个FIFO。



使用~rtems_filesystem_get_start_loc()~函数判断即将创建的路径名称是从根目录开始或相对于当前目录开始的。
确定路径名称在节点创建后是否是一个有效的可被访问的目录。
如果路径名是一个可创建节点的有效位置,验证该文件系统是否提供了~mknod()~函数。
如果~mknod()~函数存在,调用该文件系统的~mknod()~函数,并传递名称、模式、设备类型和节点创建的目录位置信息给该函数。

4.20 mount
文件:mount.c

参数(不是一个标准的~POSIX~调用):

rtems_filesystem_mount_table_entry_t **mt_entry,

如果挂载操作成功,这个指向指针的指针将被设置为指向已为这个文件系统挂载分配的挂载表项目。

rtems_filesystem_operations_table *fs_ops,

这个指针指向我们即将挂载的文件系统的函数表。
这个机制选择文件系统类型时不需要为了正确的完成挂载操作而保存一个所有可能文件系统类型的动态数据库。
使用这种方法,只需要配置我们希望在~RTEMS~执行体中使用到的文件系统。
未使用的文件系统类型将不会被编译。

char *fsoptions,

此参数指向一个选择挂载为只读访问或读/写访问的字符串。有效的字符串是~"RO"~和~"RW"。

char *device,

此参数是保留给一个设备的名称,用来访问文件系统信息。
当前文件系统的实现是基于内存的,不需要设备来访问文件系统信息。

char *mount_point

这是一个已经挂载文件系统上的允许读取、写和执行的目录的路径名。
如果成功,通过评估这个名字发现这个节点存储在~mt_entry。


处理:
此函数将挂载一个文件系统到挂载点上。
如果操作成功,返回一个指向与已挂载文件系统相关的挂载链表中的项目的指针给调用函数。
关于挂载点的处理和被挂载文件系统的处理都被封装在文件系统里的~mount()~和~fsmount_me()~函数中。
这使得通用~mount()~函数保持不变,即可支持新的文件系统类型。

开发注释:
此函数将使用~get_file_system_options()~来判断挂载选项~("RO"~或~"RW")~是否正确。
它确认文件系统的~OPS~表已经被选中。
为挂载表条目分配空间并初始化临时挂载表的相关字段。
如果指定一个挂载点:将检查挂载点,以确定它是一个目录并且也有适当的权限允许文件系统挂载到这个目录上。
在当前的挂载链表中搜索,以确定没有其他的文件系统挂载在我们试图进行挂载的挂载点上。
如果在包含挂载点的文件系统的~OPS~表中定义了~mount~函数,那么在这个时候将调用他。

如果没有指定挂载点:按挂载链表项目建立基本文件系统。
如果~fsmount_me()~函数在被挂载文件系统的~OPS~表中指定了,即调用函数来初始化新的文件系统。
在成功完成后,记录了挂载文件系统的临时挂载表项将放到挂载表链上。

4.21 open
文件:open.c

处理:此函数是建立在~RTEMS~调用和文件系统的自己实现的~open()~函数。
这些功能的接口应该不会为新文件系统而改变,因此在引入新文件系统进入系统中代码是稳定的。

开发注释:这个函数为即将打开的一个文件或设备分配文件控制块。
然后它将测试路径是否存在。如果存在将填充一个~rtems_filesystem_location_info_t~结构的数据。
此结构包含的信息与节点的信息、文件系统特定的函数和该路径的挂载链表的信息相关。

如果指定了创建选项,它尝试着在指定的路径下创建一个普通文件的节点。
如果该文件已经在指定的路径下存在,将会产生一个错误,否则,在包含该路径的文件系统下将为该文件分配一个节点。
当创建了一个新的节点时,也会对其进行评估,以便为新创建节点的~rems_filesystem_location_info_t~数据结构内填充合适的信息。
如果文件已存在或已被成功创建,将使用详细描述节点和文件系统数据的处理程序表信息,节点信息和
~rtems_filesystem_location_info_t~数据结构初始化该文件控制块结构。
如果~open()~函数存在与节点所在文件系统的处理程序表中,我们
试图进行打开操作,将在这时调用它。
如果在过程中发现有任何错误,执行清理操作。它包括释放文件
控制块结构,是在通用~open()~函数开始时分配的。
一旦~open()~成功,计算文件描述符表的索引并将其返回给调用程序。

4.22 opendir
文件:opendir.c

处理:
这个函数尝试打开一个目录进行读访问。
这将建立一个目录控制结构用来访问目录信息。
此函数基于通用的~open()~函数和文件系统特定的目录处理函数。

开发注释:
BSD~小组提供这个函数。

4.23 pathconf
文件:pathconf.c

处理:这个函数将获取一个路径配置参数并返回给调用程序。
它基于通用的~open()~函数和~fpathconf()~函数。
增加新文件系统类型到系统中不会改变这些接口。

开发注释:
这个函数将按照路径尝试打开该文件。
如果成功,pathconf~使用~fpathconf()~函数并指定名称访问该文件的文件描述符中的值。
访问完成后关闭该文件。

4.24read
文件:deviceio.c

处理:
此函数基于一系列~RTEMS~的调用和文件系统自己的读取操作。
该功能基于这样的实现方式,使它们在引入新的文件系统时可以免于修改。

开发注释:
这个函数将检查它发送的文件描述符的类型。
如果这个文件描述符与网络设备相关联,读取函数将被映射一个特别的网络处理处理程序。
从网络处理程序返回的代码作为通用~read()~函数的返回代码被返回。
对于与该文件系统相关联的文件描述符将顺序执行下列操作:

  1.  获取文件控制块相关联的文件描述符;
  2.  检查文件描述符的范围;
  3.  确定缓冲区的指针是有效的;
  4.  检查计数不为零;
  5.  检查文件控制块确定我们是否有读取权限;
  6.  如果在处理程序表中有~read()~函数,调用处理程序表中的~read()~函数;
  7.  使用从处理程序表中的~read()~函数的返回值(读取的字节数)加入文件控制块中的偏移量字段;
  8.  返回读取的字节数给调用程序。




4.25 readdir

文件:readdir.c

处理:这个函数从~BSD~小组获得。没有对原来的代码做任何的修改。

开发注释:
该函数调用一个由用户提供的~getdents()~函数。这个函数提供文件系统读取目录的特殊信息。
它基于目录处理程序表中的~read()~函数。此函数已被映射到~Imfs_dir_read()~函数。

4.26 unmount
文件:unmount.c

处理:这个例程将尝试挂载的文件系统卸除,然后释放所有资源
被分配给该文件系统的管理。

开发注释:

 这个程序将确定是否有已挂载的文件系统挂载在我们正在试图卸载的文件系统上。这将防止卸载文件系统;
 它将测试当前目录是否在我们正在试图卸载的文件系统中。这将防止卸载文件系统;
 它会扫描所有当前打开的文件描述符,以确定是否有是一个已打开的文件描述符在我们正试图~unmount()~的文件系统中。


如果上述条件得到满足,然后按以下顺序执行:

  1.  调用包含该挂载点的文件系统的~unmount()~函数。这个函数应指示挂载点下面没有挂载文件系统;
  2.  为我们试图卸载的文件系统调用它的~fsunmount_me()~函数,
  3. 这个函数应该清理被卸载文件系统的管理过程中一些不再需要的资源;
  4.  移除挂载表中的刚刚从挂载链表中卸载的文件系统;
  5.  释放与移除的挂载表项相关联的内存。