为什么作为
is_regular_file
一部分的 std::filesystem
函数对于符号链接报告为真?我查看了该调用的文档,但找不到原因,并且 cppreference 上的示例表现出相同的行为。
举个例子,如果我们看一下二进制
pidof
;它以 /usr/sbin/pidof
形式存在,并正确标记为符号链接,如下所示 stat
:
[@rhel9 ~]$ stat /usr/sbin/pidof
File: /usr/sbin/pidof -> /usr/bin/pidof
Size: 14 Blocks: 0 IO Block: 4096 symbolic link
Device: fd00h/64768d Inode: 34952482 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:bin_t:s0
Access: 2024-02-05 15:46:24.124158991 +0000
Modify: 2023-01-28 09:40:21.000000000 +0000
Change: 2023-05-09 17:34:59.432002380 +0100
Birth: 2023-05-09 17:34:59.432002380 +0100
如果我们点击链接并运行
stat
:
[@rhel9 ~]$ stat /usr/bin/pidof
File: /usr/bin/pidof
Size: 23760 Blocks: 48 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 18153014 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:bin_t:s0
Access: 2024-02-02 15:12:41.804334284 +0000
Modify: 2023-01-28 09:40:21.000000000 +0000
Change: 2023-05-09 17:34:59.418002380 +0100
Birth: 2023-05-09 17:34:59.417002380 +0100
如果我们运行以下代码:
const std::filesystem::path fsBin("/usr/sbin/pidof");
if (true == std::filesystem::is_regular_file(fsBin))
{
std::cout << "Regular File" << std::endl;
}
else if(true == std::filesystem::is_symlink(fsBin))
{
std::cout << "Symbolic Link" << std::endl;
}
尽管路径是符号链接,但代码始终打印“常规文件”。如果我交换大小写(将
is_symlink
作为第一个检查),它会正确报告它是符号链接。有趣的是,如果我使用 std::filesystem::status
对象而不是 std::filesystem::path
,无论顺序如何,它都不会报告符号链接。
对于我可能忽略的这种行为有什么解释吗?