【问题标题】:How to figure out if a file is a link?如何判断文件是否为链接?
【发布时间】:2011-04-28 10:47:23
【问题描述】:

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

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;
}

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

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

【问题讨论】:

  • 这个问题有点不清楚。你在测试一个符号链接,程序说它是一个普通文件吗? buf.st_mode 的值是多少?
  • 你需要lstat()stat() 跟随符号链接并检查它们指向的文件。

标签: c linux symlink system-calls stat


【解决方案1】:

来自stat (2) 手册页:

stat()统计path指向的文件,填写buf

lstat()stat() 相同,除了如果 path 是符号链接,则链接本身是 stat-ed,而不是它所引用的文件。

换句话说,stat 调用将跟随到目标文件的符号链接并检索那个的信息。尝试改用lstat,它会给你提供的信息链接。


如果您执行以下操作:

touch junkfile
ln -s junkfile junklink

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

#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;
}

你会得到:

 stat says file
lstat says link

正如预期的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2015-05-03
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多