`/proc/$PID/cwd`:是否有 POSIX 等价物?

Hib*_*u57 8 shell ipc posix cwd

Linux 有一个/proc目录和文件系统,据我所知,它不是 POSIX 的一部分。在每个/proc/$PID子目录中,是一个符号链接,cwd指向该PID进程的实际工作目录(该cwd链接始终是最新的)。

这个符号链接对于某些用例很方便,比如使用不同的 shell 和在两个 shell 之间交换文件(正式地,它们的工作目录)。

有没有一种简单的方法来获得类似的东西,只使用 POSIX 功能?

更多关于这个问题

发表评论后,更精确:它不一定是链接和环境变量 lile $<PID>_CWD,也一样好,虽然乍一看,我不相信这样的解决方案存在。它必须易于引用(例如符号链接或环境变量),并且每次其他进程切换其工作目录时始终保持最新。

解决方案不一定是POSIX,最重要的是可移植性,但POSIX肯定是一种保证。

ene*_*dil 7

我有一个使用lsof. 默认情况下它没有安装在 BSD 上,所以如果有人想在 BSD 上使用它,则需要安装它。

编写一个shell脚本:

#!/bin/sh
lsof -p $1 | grep cwd | awk '{print $9}'
Run Code Online (Sandbox Code Playgroud)

将其复制到您路径中的目录中。它打印第一个参数 IE 中给出的 PID 的工作目录

$ script 1987
/home/enedil
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,这个小变化也是:`lsof -p $PID | awk '/cwd/{print $9}'`。 (3认同)
  • 只需使用 `lsof -d cwd -a -p $1` 就可以节省一点 `lsof` 开销 (2认同)

Gil*_*il' 5

POSIX 在获取有关不相关进程的信息方面提供的功能不多。只有ps,真的,它没有提供有关当前目录的任何信息。C 级 APIps也好不到哪里去(事实上​​,大多数检索到的信息只能通过解析其输出来检索¹)。

有趣的是,POSIX 确实提供了一种可移植的方式来反过来:给定一个文件,您可以通过调用fuser. 以下代码段列出了具有特定工作目录的进程的 PID:

fuser -f "$directory_name" 2>&1 | sed -e '$!d' -e 's/.*://' -e 's/  */\
/' | sed -n 's/c$//p'
Run Code Online (Sandbox Code Playgroud)

如果您希望以实践中可移植的方式获得有关进程的信息,请使用lsof。lsof 的作者已经完成了在不同的 unix 变体上实现所有不同的检索信息的方法的工作。

对于休闲浏览:

lsof -a -p "$pid" -d cwd
Run Code Online (Sandbox Code Playgroud)

对于自动解析:

lsof -a -p "$pid" -d cwd -F n | sed -e '1d' -e '2s/^n//'
Run Code Online (Sandbox Code Playgroud)

请注意,lsof用字符串替换换行符\n

一些 Unix 变体提供不需要第三方软件的方法,但这些方法将强制特定于每个变体。在一个非常相关的注释中,请参阅文件描述符链接的可移植性

¹一些旧的 unice 有pssetuid root 和读取内核内存,因此使用 setuid 二进制文件是获取此信息的唯一方法。