在我的应用程序中间的某个地方,我正在使用的框架(ROOT
)给我以下错误:
*** Break *** write on a pipe with no one to read it
SysError in <TUnixSystem::UnixSend>: send (Broken pipe)
SysError in <TUnixSystem::DispatchOneEvent>: select: read error on 24
(Bad file descriptor)
如何检查哪个进程正在使用此文件描述符,最好不使用sudo
?
答案1
恐怕以后就不可能了。毕竟“损坏的管道”意味着另一个进程已经消失(或者至少已经关闭了其文件描述符)。
虽然一切都还好,但你可以这样做:
$ sleep 1000 | sleep 1000 & ps
[1] 848156
PID TTY TIME CMD
819441 pts/0 00:00:00 bash
848155 pts/0 00:00:00 sleep
848156 pts/0 00:00:00 sleep
848157 pts/0 00:00:00 ps
$ PID=848156 # PID of one of the sleep processes
$ ls -l /proc/$PID/fd
... # Skipped output lines
l-wx------ 1 hl hauke 64 15. Apr 19:11 1 -> pipe:[108237859]
... # Skipped output lines
$ lsof -n | grep 108237859 # gives you all processes which have access to this pipe
sleep 848155 hl 1w FIFO 0,8 0t0 108237859 pipe
sleep 848156 hl 0r FIFO 0,8 0t0 108237859 pipe
编辑1
如果 lsof 不可用:
for dir in /proc/[1-9]*; do
test -r "$dir"/fd || continue
if ls -ln "$dir"/fd | grep -q 108237859; then
echo "PID: ${dir#/proc/}"
fi
done
答案2
该lsof
命令将显示您打开的描述符,然后只需 grep 即可。
答案3
没有lsof
你可以尝试:
find /proc -name <descriptor> | grep fdinfo
它应该返回表单的一些结果./<pid>/fdinfo/<fd>