鉴于Linux utimes(2)
是系统调用而futimes(3)
是库函数,我认为futimes
是以utimes
实现的。但是,utimes
采用路径名,而futimes
采用文件描述符。
因为,“不可能”从文件描述符或 i-node number 确定路径名,我想知道如何做到这一点? “真实”系统调用是否始终适用于 i-node number ?
答案 0 :(得分:0)
首先,您可能错误地提到了Posix,因为后者没有区别系统调用和库函数。将futimes()置于库调用是特定于Linux的。在glibc(文件sysdeps / unix / sysv / linux / futimes.c)中,有评论:
/* Change the access time of the file associated with FD to TVP[0] and the modification time of FILE to TVP[1]. Starting with 2.6.22 the Linux kernel has the utimensat syscall which can be used to implement futimes. Earlier kernels have no futimes() syscall so we use the /proc filesystem. */
因此,这是使用utimensat()完成的,指定的描述符作为所有* at()调用的引用。以前,这使用utimes()作为路径/ proc / $ {pid} / fd / $ {fd}(太麻烦,只有在安装了/ proc时)。这是对第二个问题的回复:尽管通常无法从其描述符中检测文件名,但仍可以单独访问该文件。 (顺便说一下,有时会存储用于打开文件的初始路径;请参阅/ proc / $ pid / {cwd,exe}以获取Linux进程。)
与之比较,FreeBSD提供了显式的futimes()和futimesat()系统调用(但我想知道为什么后者没有命名为“utimesat”)。