我正在学习文件描述符对于Linux的情况,我想知道是否有任何命令显示完整列表这让我知道每个都重定向到哪里到这一刻。
也许一些信息,例如:
0 --> <stdin
1 --> >stdout
2 --> >stderr
3 --> >MyFileForWriting
4 --> <MyFileForReading
我已经发现这个线程这需要lsof
,但是拥有另一种不依赖于该命令的方法(如果存在)可能会很有用。
我需要有关 Linux 的信息(我也会尝试 CygWin,它到目前为止还不包括“lsof”工具,但其行为大多类似于 POSIX 兼容操作系统)。
答案1
文件/proc
系统将准确列出以下信息:
$ ls -l /proc/self/fd
total 0
lrwx------ 1 michas users 1 Apr 6 04:44 0 -> /dev/pts/0
lrwx------ 1 michas users 1 Apr 6 04:44 1 -> /dev/pts/0
lrwx------ 1 michas users 1 Apr 6 04:44 2 -> /dev/pts/0
lr-x------ 1 michas users 1 Apr 6 04:44 3 -> /proc/6934/fd
$ ls -l /proc/self/fd 2>/dev/null <<<foo |cat
total 0
lr-x------ 1 michas users 1 Apr 6 04:45 0 -> /tmp/sh-thd-361068043 (deleted)
l-wx------ 1 michas users 1 Apr 6 04:45 1 -> pipe:[136729]
l-wx------ 1 michas users 1 Apr 6 04:45 2 -> /dev/null
lr-x------ 1 michas users 1 Apr 6 04:45 3 -> /proc/6952/fd
如果您对其他进程感兴趣,只需将“self”替换为相应的 PID 即可。
答案2
@Patrick 在下面的评论中指出,访问这些文件需要非默认内核编译时选项。我当时并没有意识到这一点,直到现在才发现它们。虽然我确实知道我的内核包是通过包管理器安装的,所以它必须包含在至少一个发行版的默认构建中 - 所以你的里程可能会有所不同,特别是如果涉及 Cygwin。
我认为,如果至少包含在内,您会得到更完整的列表/proc/self/map_files:
% sudo ls -al ${p=/proc/$$}/map_files | sudo sort -t\> -ubk2,2
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 400000-4a6000 -> /usr/bin/zsh
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e05aa3000-7f5e05ac3000 -> /usr/lib/ld-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e04b88000-7f5e04b8c000 -> /usr/lib/libattr.so.1.1.0
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e04d8d000-7f5e04f2b000 -> /usr/lib/libc-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e0589f000-7f5e058a3000 -> /usr/lib/libcap.so.2.24
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e0569b000-7f5e0569e000 -> /usr/lib/libdl-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e05135000-7f5e05235000 -> /usr/lib/libm-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e05436000-7f5e05496000 -> /usr/lib/libncursesw.so.5.9
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e0497c000-7f5e04987000 -> /usr/lib/libnss_files-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e05afa000-7f5e05c83000 -> /usr/lib/locale/locale-archive
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e0450c000-7f5e0452f000 -> /usr/lib/zsh/5.0.5/zsh/complete.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e038e0000-7f5e038ee000 -> /usr/lib/zsh/5.0.5/zsh/complist.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e036cb000-7f5e036db000 -> /usr/lib/zsh/5.0.5/zsh/computil.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e03cf3000-7f5e03cfc000 -> /usr/lib/zsh/5.0.5/zsh/parameter.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e03aef000-7f5e03af2000 -> /usr/lib/zsh/5.0.5/zsh/stat.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e04101000-7f5e04103000 -> /usr/lib/zsh/5.0.5/zsh/terminfo.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e04731000-7f5e04773000 -> /usr/lib/zsh/5.0.5/zsh/zle.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e03efe000-7f5e03f00000 -> /usr/lib/zsh/5.0.5/zsh/zleparameter.so
lr-------- 1 mikeserv mikeserv ? 64 Apr 5 21:07 7f5e04304000-7f5e0430b000 -> /usr/lib/zsh/5.0.5/zsh/zutil.so
这是一个排序的唯一列表。该列表看起来非常接近:
% lsof -p ${p##*/}
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
zsh 23748 mikeserv cwd DIR 0,3 0 7800580 /proc/23748/map_files
zsh 23748 mikeserv rtd DIR 0,33 254 256 /
zsh 23748 mikeserv txt REG 0,33 705496 1281560 /usr/bin/zsh
zsh 23748 mikeserv mem REG 0,30 1281560 /usr/bin/zsh (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281593 /usr/lib/zsh/5.0.5/zsh/computil.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281592 /usr/lib/zsh/5.0.5/zsh/complist.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281579 /usr/lib/zsh/5.0.5/zsh/stat.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281576 /usr/lib/zsh/5.0.5/zsh/parameter.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281596 /usr/lib/zsh/5.0.5/zsh/zleparameter.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281582 /usr/lib/zsh/5.0.5/zsh/terminfo.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281587 /usr/lib/zsh/5.0.5/zsh/zutil.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281591 /usr/lib/zsh/5.0.5/zsh/complete.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1281595 /usr/lib/zsh/5.0.5/zsh/zle.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1936654 /usr/lib/libnss_files-2.19.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 23825 /usr/lib/libattr.so.1.1.0 (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1936661 /usr/lib/libc-2.19.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1936618 /usr/lib/libm-2.19.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 24316 /usr/lib/libncursesw.so.5.9 (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1936627 /usr/lib/libdl-2.19.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1249113 /usr/lib/libcap.so.2.24 (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1936645 /usr/lib/ld-2.19.so (path dev=0,33)
zsh 23748 mikeserv mem REG 0,30 1720288 /usr/lib/locale/locale-archive (path dev=0,33)
zsh 23748 mikeserv 0u CHR 136,6 0t0 9 /dev/pts/6
zsh 23748 mikeserv 1u CHR 136,6 0t0 9 /dev/pts/6
zsh 23748 mikeserv 2u CHR 136,6 0t0 9 /dev/pts/6
zsh 23748 mikeserv 10u CHR 136,6 0t0 9 /dev/pts/6
好吧,无论如何,文件名都是如此。我认为很多这样的功能可以很容易地用可能stat,
和ps
/或感兴趣的 pid 来重现。显然有一个fd
目录,正如另一个答案中提到的,您也可以从/proc/self
文件系统获取 root、cwd。