No.
这不是真的fstat
遵循符号链接。反而,open
遵循符号链接。一旦你到达fstat
,为时已晚,信息消失了。
Tell us为什么您需要知道,我们可以帮助解决这个问题。 (打开另一个问题。)
文件如何工作:
下面是一些伪 C/shell 代码:
system("echo 'Hello, World!' >A.txt");
system("ln A.txt B.txt");
system("ln -s A.txt C.txt");
fdes = open("C.txt");
unlink("A.txt");
unlink("C.txt");
data = read(fdes);
write(stdout, data);
结果:你的程序打印"Hello, world!"
。世界的现状是这样的:
+--Application--+ +--Kernel--+ +-------Disk-------+
| | | | | |
| fdes --------------> file ---------> inode #973 <-------+
| | | | | "Hello World!" | |
+---------------+ +----------+ | | |
| directory ---------+
| "B.txt" |
| |
+------------------+
就内核而言,打开的文件是“inode #973”。内核内存中的数据结构有一些附加信息,例如当前位置,但它不知道路径。内核不应该知道该信息。
如果你问内核路径是什么,它会回答could说“你有 B.txt”打开。但是您从未打开“B.txt”,您打开了“C.txt”,它是“A.txt”的符号链接,并且“A.txt”和“C.txt”都已被删除(它们只是首先)。
简单的比喻:
你接到一个老朋友的电话。他问道:“我是否在电话簿中查找过你的电话号码,是否记住了它,还是我必须向别人询问你的电话号码?”
你没有办法知道答案。您所知道的只是线路另一端的人是谁。就像打开的文件不存储有关其名称的信息(硬链接或符号链接)一样,它只包含有关权限和数据的信息。
解决方案:只需使用lstat
(是的,存在竞争条件)。如果您自己没有打开该文件(例如,您从父进程获取它或通过套接字获取它),那么或多或少不可能知道它是否是通过符号链接打开的。