如何判断文件是否是链接?

Ete*_*ner 12 c linux symlink system-calls stat

我有下面的代码,这里只显示了它的一部分,我正在检查文件的类型.

struct stat *buf /* just to show the type buf is*/ 

switch (buf.st_mode & S_IFMT) {
     case S_IFBLK:  printf(" block device\n");            break;
     case S_IFCHR:  printf(" character device\n");        break;
     case S_IFDIR:  printf(" directory\n");               break;
     case S_IFIFO:  printf(" FIFO/pipe\n");               break;
     case S_IFLNK:  printf(" symlink\n");                 break;
     case S_IFREG:  printf(" regular file\n");            break;
     case S_IFSOCK: printf(" socket\n");                  break;
     default:       printf(" unknown?\n");                break;
}
Run Code Online (Sandbox Code Playgroud)

问题:st_mode当我做printf("\nMode: %d\n",buf.st_mode);结果时获得的值是33188.

我用常规文件类型和符号链接测试了我的程序.在这两种情况下,输出都是"常规文件",即符号链接情况失败,我不明白为什么?

pax*_*blo 20

stat (2)手册页:

stat()由路径指向并填写的文件的统计信息buf.

lstat()是相同的stat(),不同之处在于,如果路径是符号链接,则链接本身是STAT-ED,而不是它是指该文件.

换句话说,该stat调用将遵循指向目标文件的符号链接并检索该信息.请尝试使用lstat,它将为您提供链接的信息.


如果您执行以下操作:

touch junkfile
ln -s junkfile junklink
Run Code Online (Sandbox Code Playgroud)

然后编译并运行以下程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main (void) {
    struct stat buf;
    int x;

    x = stat ("junklink", &buf);
    if (S_ISLNK(buf.st_mode)) printf (" stat says link\n");
    if (S_ISREG(buf.st_mode)) printf (" stat says file\n");

    x = lstat ("junklink", &buf);
    if (S_ISLNK(buf.st_mode)) printf ("lstat says link\n");
    if (S_ISREG(buf.st_mode)) printf ("lstat says file\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你会得到:

 stat says file
lstat says link
Run Code Online (Sandbox Code Playgroud)

正如所料.