为了
$ any-process | receiver
可以receiver
获取发送进程的PID吗?
答案1
不直接。可以,但需要识别它所连接的管道,然后在所有其他 pid 中搜索连接到该管道的管道。
假设receiver
pid 1730。它可以查看/proc/self/fd/0
(或者更简单地,/proc/self/fd/0
)并看到它显示为 的符号链接pipe:[43270]
。/proc/1730/fdinfo/0
。然后它会发现/proc/1729/fd/1
显示为符号链接pipe:[43270]
,并且/proc/1729/fdinfo/1
看到它在标志中01
。因此,它找到了一个控制管道另一端的过程。
请注意:
- 这是 Linux 特有的方法,不可移植且效率低下
- 多个进程可能能够写入该管道(而且,写入根本不需要位于 fd 1)
- 它很容易出现竞争条件
- 如果
any-process
由不同的用户拥有,receiver
将无法查看他们的文件描述符
如果您想要让两个进程以经过身份验证的方式进行通信,则应该使用 unix 套接字。通过它们,可以通过SO_PASSCRED
选项使用SCM_CREDENTIALS
带有发送者的 pid、uid 和 gid 类型的辅助消息。发送者指定的凭据由内核检查,以确保它不会撒谎(除非它具有适当的功能,根进程/CAP_SYS_ADMIN会能够指定与其自身不同的进程 ID)。
答案2
一个简单的方法可以通过将执行进程重定向到文件描述符 3 来实现,下面是一个示例睡觉通过管道传送到的命令附注命令 :
( sleep 100 & echo $!>&3 ) 3>pid | ps -p "$(<pid)"
您可以检查命令 sleep 的过程:
ps -p $(<pid)