如果我这样做(在类似Bourne的外壳中):
exec 3> file 4>&3 5> file 6>> file
由于3是dup()
ed的4,所以文件描述符3和4 共享相同的打开文件描述(相同的属性,文件中的相同偏移量...)。虽然该过程的文件描述符5和6在不同的打开文件描述中(例如,它们各自在文件中都有自己的指针)。
现在,在lsof
输出中,我们看到的是:
zsh 21519 stephane 3w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG 254,2 0 10505865 /home/stephane/file
更好lsof +fg
:
zsh 21519 stephane 3w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG W,AP,LG 254,2 0 10505865 /home/stephane/file
(在Linux 3.16上),因为我们看到fd 6具有不同的标志,因此它必须是与fd 3、4或5上的打开文件描述不同的打开文件描述,但是由此我们不能看出fd 5在a上。不同的打开文件描述。使用-o
,我们还可以看到偏移量,但是同样的偏移量并不能保证它是相同的打开文件说明。
有没有非侵入式的1种方法可以找出答案?外部还是进程自己的文件描述符?
1。一种启发式方法可能是更改一个fd的标志,fcntl()
并查看结果是否更新了其他文件描述符的标志,但这显然不是理想的方法,也不是简单的证明