鉴于在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/