【问题标题】:Is there a POSIX syscall to resolve file system paths?是否有 POSIX 系统调用来解析文件系统路径?
【发布时间】:2011-02-12 23:12:46
【问题描述】:

是否有 POSIX 系统调用来解析文件系统路径?我有 CWD 的路径,以及来自该 CWD 的文件的路径。我不能使用chdir 切换到目录,因为我需要同时解析来自多个线程的路径。我考虑在 CWD 和路径之间附加一个/,但由于某种原因,感觉这很 hacky。这是解决相对路径的正确方法吗?

【问题讨论】:

  • .//..///cwd///////file 是完全可以接受的 posix 路径(尽管您可能不想将其显示给用户)。
  • 您想要 规范化 路径吗?例如从 ../../bin/..// ?

标签: unix macos posix system-calls


【解决方案1】:

我认为在几乎所有情况下附加/ 应该就足够了——即使使用...、额外的/s 或符号链接,它也应该做正确的事情。如果您真的想使用标准库执行此操作,可以使用 realpath(3) 进行路径规范化,但我不知道有什么方法可以完全按照您的要求进行。

【讨论】:

  • 我很确定他想要 realpath(),+1
【解决方案2】:

根据您要对该文件执行的操作,以及如果您可以接受 POSIX.1-2008 中相对较新的添加,openat 和朋友可能会感兴趣:

int dirfd = open(desired_cwd_path, O_RDONLY);
int fd = openat(dirfd, file_relpath, O_RDONLY);
close(dirfd);
// ...use fd

(这些系统调用在例如 Solaris 和 Linux 上已经存在了一段时间。)

【讨论】:

  • 叹息...在 Mac OS X 上不可用,至少从 10.5.7 开始。相反,Linux 手册页说“openat() 和其他以 'at' 为后缀的类似系统调用受到支持有两个原因。[...] 其次,openat() 允许实现每个线程的“当前工作目录” ',通过应用程序维护的文件描述符。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多