如何使用stat()函数判断一个文件是否为符号链接?

17

我必须为一个课程编写一个类似于UNIX ls命令的克隆版本,几乎所有东西都已经可以工作了。唯一我无法弄清楚如何做的是检查文件是否为符号链接。从stat()man页中,我看到定义了一个mode_t值,即S_IFLNK

这是我尝试检查文件是否为符号链接的方式,但无济于事(注意,stbuf是stat()返回的inode数据的缓冲区):

switch(stbuf.st_mode & S_IFMT){
    case S_IFLNK:
        printf("this is a link\n");
        break;
    case S_IFREG:
        printf("this is not a link\n");
        break;
}

即使链接是存在的,我的代码总是打印this is not a link。我知道实际上这个文件是一个符号链接,因为ls命令也是这么说的,而且我自己创建了这个符号链接……

有人能发现我做错了什么吗?感谢帮助!


2
引用我的stat(2)手册:lstat()与stat()相同,只是如果路径是符号链接,则对链接本身进行stat操作,而不是它所指向的文件。 - Philip
1个回答

29

你无法这样做。

你需要使用 lstat() 来获取符号链接本身的状态信息,普通的 stat() 会跟随符号链接,因此永远无法“看到”符号链接本身。


那么为什么要使用stat()命令呢?我刚刚尝试使用lstat(),它似乎提供了相同的信息,只是处理链接。你什么时候会使用stat()呢?是在你知道你不涉及任何符号链接时才使用吗? - hora
3
在处理符号链接时,您也会使用它,通常情况下,您不关心路径是普通文件还是链接文件,而是关心所使用的文件。例如,对于链接的修改时间(mtime)完全不重要,而对于链接指向的文件的修改时间则很重要。 - wich
4
stat() 函数处理链接,只是处理方式不同 - 它会跟随链接并告诉你它所指向的文件(正如 wich 所指出的那样,这通常是你想要的)。 - caf
2
当您希望链接以“正常方式”运行,即作为它们指向的文件时,可以使用stat()。只有需要区分链接和非链接的应用程序才需要使用lstat()。 - unwind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接