在C ++中,我如何检查我们正在打开的文件是否通过符号链接重定向?这是我的文件启动程序处理程序:
f=fopen(addr.c_str(), "rb");
提前致谢
答案 0 :(得分:2)
您想查看lstat
并查看st_mode
S_IFLNK
的{{1}}字段。
答案 1 :(得分:2)
如果你使用stat(),它会自动跟随符号链接。如果使用fstat(),则已经遵循符号链接,因为文件将被打开以获取文件描述符。
在这种特殊情况下,lstat()优于stat()和fstat(),因为它不遵循符号链接。调用lstat()后,调用open()。但是,这种方法存在固有的竞争条件问题;另一个进程/线程/任务可能在调用lstat()和open()之间出现,并将文件更改为符号链接。
幸运的是,这种竞争条件有一个解决方案。使用open()打开文件时,您可以使用标志O_NOFOLLOW。如果有符号链接,这将告诉open()不要遵循符号链接。但是,您仍然需要知道您打开的文件是否是符号链接(但未遵循)。为此,请使用从open()返回的文件描述符和fstat()。
希望这有帮助。