2017-05-08 15 views
2

我注意到Linux现在有renameat,fstatat,openat和其他各种调用,它们允许您指定相对于文件描述符的路径,而不是像通常那样相对于进程的当前工作目录进行解释案件。Linux似乎在通话中获得了很多*号码?这些动机是什么?

为什么要添加这些调用?似乎有at版本的大多数系统调用都有路径名称参数,所以必须有一个非常引人注目的用例。但我无法想象它是什么。

+0

背后的想法是支持我们有记忆的最长路径。把它与任意的东西联系起来是不好的想法。 – 0andriy

+0

我认为可以方便地引用相对于当前目录以外的其他路径。它也可以帮助内核:不是传递很长的路径,而是很多次,一个进程可以传递较短的,相对的内核 - 内核已经有一些缓存的数据作为参数传递给你的fd。 – linuxfan

+0

我怀疑这个原因比你们都列出来的更有说服力。我怀疑它可能与进程能够预测地与特定目录一起工作,即使它被重命名。 – Omnifarious

回答

2

所有这些*at例程都是作为POSIX的一部分引入的。如果你深入到openat routine的基本原理部分,你会发现以下段落:

实现了openat的目的()的功能是能够在比当前工作目录等目录打开文件而不暴露于竞争条件。文件路径的任何部分都可以并行调用open(),导致未指定的行为。通过打开目标目录的文件描述符并使用openat()函数,可以保证打开的文件相对于所需的目录。

换句话说,这是一种安全措施。

相关问题