为什么文件描述符只打开和读取一次?

为什么文件描述符只打开和读取一次?

为什么我们自己打开文件描述符并重定向到stdin时只能使用1次?请看下面的例子来理解我想说的。使用 cat 命令读取一次后,不会通过同一文件描述符第二次读取该文件。

└─$ exec 6< input.txt
└─$ cat <&6
i am just string
and another string..
└─$ cat <&6
└─$

答案1

要打印文件,首先cat必须读取它直到结束。 exec 6< input.txt导致 shell 保留文件描述符,直到 shell 终止或关闭它,因此当调用第二个时,文件偏移量仍然指向文件的末尾cat,因此不会向 stdout 写入任何内容。

如果在基于 Linux 的系统上,您可以通过查看文件描述符信息来看到发生的情况:

echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6

如果你执行该脚本,你会得到类似的结果

pos:    0
flags:  0100000
mnt_id: 113
File contents
pos:    14
flags:  0100000
mnt_id: 113

确认第二个执行时offset ( pos) 不为 0 ,而是指向其末尾。cat

要重置偏移量,您可以在 sexec 6< input.txt之间添加另一个偏移量cat

相关内容