RTEMS文件系统(4):系统调用开发信息(中)

4.11 fdatasync
文件:fdatasync.c

处理:此函数是内存文件系统(IMFS)的模板,将指导我们到相应的处理函数进行~fdatasync()~处理。
在内存文件系统中该函数是非必要的。在一个采用内存高速缓存的磁盘文件系统上它的功能是将数据缓冲区的数据写入磁盘。
它基于以下函数和宏:

  •  rtems_file_descriptor_type();
  •  rtems_libio_iop();
  •  rtems_libio_check_fd();
  •  rtems_libio_check_permissions();
  •  与这个文件描述符关联的文件控制块中处理例程表所引用的~fdatasync()~函数。



开发注释:
该例程将检查文件描述符索引是否与网络连接相关联。
如果是,则从这个例程返回一个错误。
文件描述符索引号是用来获取相关的文件控制块。
文件描述符的值已被检查了范围。
检查文件控制块以确定是否拥有对它的写权限。
测试文件控制块所引用的处理程序表中是否包含~fdatasync()~处理函数。
如果没有,将返回一个错误给调用例程。
如果存在~fdatasync()~函数,程序会将文件控制块作为参数调用该函数。

4.12 fpathconf
文件:fpathconf.c

处理:此函数基于以下函数和宏:

  •  rtems_file_descriptor_type()
  •  rtems_libio_iop()
  •  rtems_libio_check_fd()
  •  rtems_libio_check_permissions()



当一个文件系统已被挂载,将为文件系统指定一组常量。
文件系统的这些常量与挂载表项存储在一起。
这些常量是~POSIX~标准的一部分,下面列出这些常量:

  •  PCLINKMAX
  •  PCMAXCANON
  •  PCMAXINPUT
  •  PCNAMEMAX
  •  PCPATHMAX
  •  PCPIPEBUF
  •  PCCHOWNRESTRICTED
  •  PCNOTRUNC
  •  PCVDISABLE
  •  PCASYNCIO
  •  PCPRIOIO
  •  PCSYNCIO



这个函数为指定的文件描述符参数寻找与文件控制块相关的挂载表信息。
挂载表项结构包含一套文件系统特定的可用单独识别码访问的常量。

开发注释:
该例程将检查文件描述符索引是否与网络连接相关联。
如果是,则从这个例程返回一个错误。
文件描述符索引号是用来获取相关的文件控制块。
文件描述符的值已被检查了范围。
检查文件控制块以确定是否拥有对它的读权限。
文件控制块中的~Pathinfo~字段为与文件系统关联的文件描述符定位挂载表中的条目。
挂载表条目包含~pathconf_limits_and_options~字段。此字段是一个与文件系统相关的常数表。
name~参数是用于从~pathconf_limits_and_options~中引用所需的常量。

4.13 Fstat软件
文件:fstat.c

处理:
这个函数将返回与文件或网络连接有关的信息。
如果该文件描述符是与网络连接相关,fstat()~的目前实现将返回一个设置为~S_IFSOCK~的模式。
在以后的版本,这个例程将网络连接的状态映射到外部处理程序。
如果文件描述符与一个文件系统某个节点相关联,fstat()~函数将映射到节点处理程序表中的~fstat()~函数。
开发注释:这个例程验证结构中的~stat~指针不为空~(NULL),返回位置才是有效的。
stat~结构应初始化为零。
rtems_file_descriptor_type()~是用来判断文件描述符是否与网络连接相关联。
如果是,执行网络状态处理。在当前实现,文件描述符类型的处理需要加以改进。
目前,它只是对文件系统的节点给予正常的处理。

如果文件描述符与文件系统上的某个节点相关联,将执行下面的步骤:

  1.  获取与文件描述符索引相关的文件控制块;
  2.  检查文件描述符索引的范围;
  3.  检查处理程序表中的~fstat()~函数是否为非空。如果是,程序以文件控制块和~stat~结构的指针做为参数调用该函数。



4.14 ioctl
4.14 ioctl
文件:ioctl.c

处理:没有在~POSIX 1003.1b~的标准中定义但通常在大多数的~UNIX~和~POSIX~系统都支持这个函数。
ioctl()~包罗所有的~I/O~操作。
该函数基于外部网络处理程序和文件系统相关的处理程序。
新开发的文件系统不应改变这个函数的基本处理。

开发注释:
检查文件描述符以确定它是否与一个网络设备相关联。
如果它正有一个处理被映射到外部网络处理程序。
此处理程序返回的值被返回到调用程序。

与文件系统相关的文件描述符会进行以下处理:

  1.  用文件描述符索引来获取相关的文件控制块;
  2.  对文件描述符的值做范围检查;
  3.  检查文件控制块引用的处理程序表中是否包含~ioctl()~函数的入口。如果没有包含,则向调用程序返回一个错误;
  4.  如果~ioctl()~函数存在,程序将以文件控制块、命令和缓冲区作为参数调用该函数;
  5.  这个函数的返回代码会发送给调用程序。



4.15 link
文件:link.c

处理:
函数将建立一个硬链接到一个文件、目录或设备。
一个新被创建的链接时,与该硬链接的目标必须在同一文件系统上。
链接一个现有的链接也是允许的,但生成新的链接之前要对现有的链接进行评估。
这意味着在链接创建前对链接的链接精简为链接到文件、目录或设备。

开发注释:
调用参数:const char *existing, const char *new

link()~会使用~rtems_filesystem_evaluate_path()~判定链接的目标是否存在。
rtems_filesystem_get_start_loc()~用来确定从哪里开始的新名称的路径评估。
这个宏检查路径名的第一个字符,看看新的链接名称是否以一个~rtems_filesystem_is_separator~开始的。
如果它是则从~RTEMS~文件系统的根开始搜索,否则从当前目录开始搜索。

父文件系统的~OPS~表中的~evalformake()~函数用来定位新链接的父节点。
它也将定位新的路径的名字开始位置。
此名称将用于定义一个父目录下的子节点。
如果发现父节点,函数将判断我们试图创建的硬链接是否跨越了文件系统的边界。
如果是,则不允许创建硬链接。
如果硬链接没有跨越文件系统边界,检查~OPS~表中是否包含一个~link()~函数的入口。
如果有~link()~函数的定义,将调用~OPS~表中的~link()~函数在文件系统里创建一个实际的链接。
OPS~表中的~link()~函数返回值将被传递给调用程序。

4.16 lseek
文件:lseek.c

处理:
此例程是基于外部处理程序和文件系统/节点类型的具体处理程序。这个程序应允许不经修改即可支持新文件系统。

开发注释:
这个函数判断文件描述符是否与网络设备相关联。
如果是,lseek~将映射到外部网络的处理程序。
这个处理器将被调用并使用文件描述、偏移量和从哪里开始作为其调用参数。
从外部处理程序返回的代码将传递给调用程序。
如果文件描述符没有与网络连接相关联的,它与一文件系统中的节点相关联。
对于文件系统节点将执行以下处理:

  1.  使用文件描述符用来获取节点的文件控制块;
  2.  对文件描述符的范围检查;
  3.  文件控制块中的偏移量字段被转换为调用参数所使用的偏移量和从哪开始的指示;
  4.  检查文件控制块的处理程序表中是否含有~lseek()~函数的入口。如果没有,则向调用程序返回一个错误;
  5.  调用处理程序表中的~lseek()~函数,并以文件控制块、偏移量和从哪里开始作为其调用参数;
  6.  将~lseek()~函数的返回值传递给调用程序。




4.17 mkdir
文件:mkdir.c

处理:
这个例程尝试在文件系统下创建一个目录节点。该例函数基于~mknod()~函数。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值