鉴于在Linux中utimes(2)是系统调用,而futimes(3)是库函数,我认为futimes是根据utimes实现的。但是,utimes采用路径名,而futimes采用文件描述符。

由于“不可能”从文件描述符或索引节点号确定路径名,我想知道如何做到这一点? “真实”系统调用是否始终在索引节点编号上起作用?

最佳答案

首先,您可能会错误地提及Posix,因为后者与系统调用和库函数没有区别。将futimes()放入库调用是Linux特定的。在glibc(文件sysdeps / unix / sysv / linux / futimes.c)中,有以下注释:

/ *将与FD关联的文件的访问时间更改为TVP [0]和
   FILE到TVP [1]的修改时间。

   从2.6.22开始,Linux内核具有utimensat syscall,
   可用于实现futimes。较早的内核没有futimes()
   syscall,所以我们使用/ proc文件系统。 * /


因此,这是通过使用utimensat()和所有* at()调用的指定描述符作为参考来完成的。以前,这使用utimes()来实现/ proc / $ {pid} / fd / $ {fd}的路径(太麻烦了,并且只有在安装了/ proc的情况下)。这是对您的第二个问题的答复:尽管通常无法从其描述符中检测文件名,但仍可以单独访问该文件。 (顺便说一句,有时会存储用于打开文件的初始路径;有关Linux进程,请参见/ proc / $ pid / {cwd,exe}。)

与之相比,FreeBSD提供了显式的futimes()和futimesat()系统调用(但我想知道为什么后者没有命名为“ utimesat”)。

关于linux - 如何用utimes实现futimes?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20719957/

10-11 05:00