可通过ls -l /proc/[PID]/fd/查看pipe:[inode]标识,或用lsof -p [PID] | grep pipe筛选;匿名管道无路径,需比对父子进程fd中inode号是否一致以确认通信关系,命名管道则可用find和lsof按路径查找。

怎么查某个进程正在用哪个 pipe 文件描述符?
Linux 中的匿名管道没有文件路径,它只存在于内核中,靠两个进程共享的 fd(文件描述符)维持。所以不能像普通文件那样用 ls 或 find 查;得从进程的 /proc/PID/fd/ 入手。
假设你想查 PID 为 1234 的进程是否正在使用管道通信:
- 先运行
ls -l /proc/1234/fd/,观察输出里有没有类似pipe:[1234567]的条目 —— 这就是管道的内核 inode 号,不是路径 - 再用
lsof -p 1234 | grep pipe快速过滤出所有管道 fd - 如果看到
0r、1w这类标记,说明该进程正把管道当标准输入/输出用(比如 shell 管道|启动的子进程)
注意:pipe:[1234567] 这个数字是内核分配的唯一标识,同一管道在父子进程中会显示相同的 inode 号 —— 这是你确认“两端连的是同一个 pipe”的关键依据。
怎么确认两个进程是否通过同一匿名管道通信?
单看一个进程的 /proc/PID/fd/ 不足以判断通信关系,必须交叉比对父子或兄弟进程的 fd inode 号。
典型操作流程:
- 用
ps -eo pid,ppid,comm | grep your_process_name找出目标进程及其父进程 PID - 分别执行
ls -l /proc/<pid>/fd/ | grep pipe</pid>和ls -l /proc/<ppid>/fd/ | grep pipe</ppid> - 对比两者输出中
pipe:[*]的数字是否一致 —— 一致就说明它们共享同一匿名管道
常见陷阱:如果父进程 fork 后没关闭不用的 fd,子进程继承后可能同时打开读写两端,导致死锁(比如都等着对方先读/先写)。此时 lsof 会显示同一 inode 在两个进程里都存在,但方向(r/w)和实际用途需结合代码逻辑判断。
命名管道(FIFO)怎么查?它能直接看到路径
命名管道不同,它有真实路径,本质是特殊文件,所以可直接用文件系统命令定位。
查法分两步:
- 先用
find /tmp /var/run -type p 2>/dev/null扫描常见 FIFO 存放位置(路径取决于程序约定) - 再用
lsof +D /path/to/fifo或lsof | grep /path/to/fifo查哪些进程正打开它 - 配合
ipcs -p没用 ——ipcs只管 System V IPC(消息队列、共享内存、信号量),不管 FIFO
注意:mkfifo 创建的 FIFO 文件权限和属主会影响能否被其他用户进程访问;若 lsof 查不到进程,可能是 FIFO 已创建但尚未被任何进程 open(),此时它只是个空壳文件。
为什么 ss 或 netstat 查不到 pipe?
ss -tulpn、netstat -tulpn 这些工具只查 socket 类型的 IPC(包括本地 Unix domain socket),而 pipe 是内核 VFS 层的抽象,不属于网络协议栈范畴。
误用后果:
- 用
ss -tp | grep pipe永远返回空 —— 因为 pipe 根本不走 socket 接口 - 混淆命名管道和 Unix socket:前者是
mkfifo创建的普通文件(ls -l显示p),后者是socket()创建的特殊文件(ls -l显示s) - 想查 Unix socket 通信请用
ss -x -p,不是ss -t
真正难的不是找 pipe,而是理解它的生命周期完全绑定进程 —— 没有用户态路径、不持久化、关掉所有 fd 就自动销毁。这意味着你查到的瞬间,它可能已经不存在了。











