1

在 C++ 中,我将如何检查我们正在打开的文件是否正在通过符号链接重定向?这是我的文件打开器处理程序:

 f=fopen(addr.c_str(), "rb");

提前致谢

4

2 回答 2

2

您想查看lstat并检查for的st_mode字段。struct statS_IFLNK

于 2010-11-21T10:54:53.383 回答
2

如果您使用 stat(),它将自动跟随符号链接。如果您使用 fstat(),则符号链接将已被跟踪,因为文件将已打开以获取文件描述符。

在这种特殊情况下, lstat() 比 stat() 和 fstat() 更可取,因为它不遵循符号链接。调用 lstat() 后,再调用 open()。但是,这种方法存在固有的竞争条件问题;在调用 lstat() 和 open() 之间可能会出现另一个进程/线程/任务,并将文件更改为符号链接。

幸运的是,有一个解决这种竞争条件的方法。使用 open() 打开文件时,您可以使用标志 O_NOFOLLOW。如果有符号链接,这将告诉 open() 不要遵循符号链接。但是,您仍然需要知道您打开的文件是否是符号链接(但未遵循)。为此,请将 open() 返回的文件描述符与 fstat() 一起使用。

希望这可以帮助。

于 2010-11-21T12:35:39.933 回答