为什么 is_regular_file 对于符号链接报告为 true

问题描述 投票:0回答:1

为什么作为

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
,无论顺序如何,它都不会报告符号链接。

对于我可能忽略的这种行为有什么解释吗?

c++ symlink std-filesystem
1个回答
0
投票

is_regular_file(path)
回答“这是一个常规文件在遵循符号链接之后吗?” cpp参考

is_symlink(path)
回答“这是符号链接吗?” cpp参考

© www.soinside.com 2019 - 2024. All rights reserved.