在 Perl 中从文件名获取文件描述符

Get file descriptor from filename in Perl

我在 Perl 中使用遗留库,它正在泄漏文件描述符(我无权访问 C 源代码)

我知道代码打开的文件名,但不知道文件描述符。有什么办法可以确定文件描述符以便关闭它吗?

/proc/<pid>/fd 有文件描述符。

$ ls -l /proc/$$/fd
total 0
lrwx------ 1 ikegami pg1404028 64 Jan 12 20:26 0 -> /dev/pts/3
lrwx------ 1 ikegami pg1404028 64 Jan 12 20:26 1 -> /dev/pts/3
lrwx------ 1 ikegami pg1404028 64 Jan 12 20:26 2 -> /dev/pts/3
lrwx------ 1 ikegami pg1404028 64 Jan 12 20:26 255 -> /dev/pts/3

您也可以尝试lsof -a -p <pid>

$ lsof -a -p $$
lsof: WARNING: can't stat() debugfs file system /sys/kernel/debug
      Output information may be incomplete.
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF        NODE NAME
bash    13841 ikegami  cwd    DIR   8,17     4096 12884902307 /home/ikegami
bash    13841 ikegami  rtd    DIR    8,1     4096           2 /
bash    13841 ikegami  txt    REG    8,1   959120      130675 /bin/bash
bash    13841 ikegami  mem    REG    8,1    52120      914147 /lib/x86_64-linux-gnu/libnss_files-2.15.so
bash    13841 ikegami  mem    REG    8,1    47680      914446 /lib/x86_64-linux-gnu/libnss_nis-2.15.so
bash    13841 ikegami  mem    REG    8,1    97248      914458 /lib/x86_64-linux-gnu/libnsl-2.15.so
bash    13841 ikegami  mem    REG    8,1    35680      914035 /lib/x86_64-linux-gnu/libnss_compat-2.15.so
bash    13841 ikegami  mem    REG    8,1  1811128      914019 /lib/x86_64-linux-gnu/libc-2.15.so
bash    13841 ikegami  mem    REG    8,1    14768      914453 /lib/x86_64-linux-gnu/libdl-2.15.so
bash    13841 ikegami  mem    REG    8,1   159200      914028 /lib/x86_64-linux-gnu/libtinfo.so.5.9
bash    13841 ikegami  mem    REG    8,1   149280      914450 /lib/x86_64-linux-gnu/ld-2.15.so
bash    13841 ikegami    0u   CHR  136,3      0t0           6 /dev/pts/3
bash    13841 ikegami    1u   CHR  136,3      0t0           6 /dev/pts/3
bash    13841 ikegami    2u   CHR  136,3      0t0           6 /dev/pts/3
bash    13841 ikegami  255u   CHR  136,3      0t0           6 /dev/pts/3