从文件描述符 3 和 /proc 写入和读取

从文件描述符 3 和 /proc 写入和读取

当我运行以下命令时:

exec 3<<< "TEST"

我可以看到以下内容出现在/proc(注意有关 FD3 读取的最后一行已删除):

# ls -al /proc/$$/fd
total 0
dr-x------ 2 root root  0 Jan 18 21:09 .
dr-xr-xr-x 9 root root  0 Jan 18 21:09 ..
lrwx------ 1 root root 64 Jan 28 16:22 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 18 21:09 2 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 255 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 28 20:42 3 -> /tmp/sh-thd-1123912022914878506 (deleted)

我可以读取 FD 3 的内容一次,但之后就无法再读取了:

# cat 0<&3
TEST
# cat 0<&3
# cat 0<&3

我的问题是,如果/proc/$$/fd/3它已经被读为“已删除”,那么为什么我仍然可以阅读其内容背后的理论是什么?

答案1

您仍然可以从文件描述符中读取。问题是您正在使用“dup2”系统调用来对文件描述符进行第二次引用,并且文件描述符有一个位置。在你的第一只猫之后,该位置位于数据的末尾。您可以一次读取一点数据(这里我read以一次读取一行为例,通常您会使用 read -r),并且我使用 perl 作为将位置倒回到开头的简单方法文件的。

 $ exec 3<<<'This is some text
 > and some more
 > that is all folks'
 $ read <&3 ; echo "$REPLY"
 This is some text
 $ read <&3 ; echo "$REPLY"
 and some more
 $ perl -e 'sysseek(stdin,0,0);' <&3
 $ read <&3 ; echo "$REPLY"
 This is some text

答案2

当不再有目录条目指向该文件时,该文件将被“删除”。从这个意义上说,文件可能被删除,但仍然存在于磁盘上。这索引节点文件的内容以及文件的内容在文件关闭之前不会被删除。

当文件没有目录项时,无法直接打开它。但是,仍然可以将现有描述符复制到该文件,这就是重定向的作用。/proc/PID/fd/FD

如果系统崩溃且文件仍然打开但被删除,则数据将在稍后删除:或者在下次启动时重播日志时,或者通过FSCK当它检测到带有链接数等于 0。

答案3

您尚未关闭该文件描述符,因此尚未释放其资源。但是,您已经读取了该文件描述符上可用的所有内容。未来的读取将立即获得 EOF,但文件描述符尚未关闭,因此它仍然存在。

相关内容