【问题标题】:How do you determine using stat() whether a file is a symbolic link?您如何使用 stat() 确定文件是否为符号链接?
【发布时间】:2011-02-07 19:40:15
【问题描述】:

我基本上必须为一个类编写一个 UNIX ls 命令的克隆,而且我几乎已经完成了所有工作。我似乎不知道该怎么做的一件事是检查文件是否是符号链接。在stat()man 页面中,我看到定义了一个mode_tS_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 命令是这样说的,而且我创建了符号链接......

谁能发现我做错了什么?感谢您的帮助!

【问题讨论】:

  • 引用我的 stat(2) 手册页:lstat() 与 stat() 相同,除了如果 path 是符号链接,则链接本身是 stat-ed,而不是它的文件指。

标签: c symlink inode


【解决方案1】:

你不能。

您需要使用@987654321@ 来统计链接本身,纯stat() 将跟随链接,因此永远不会“看到”链接本身。

【讨论】:

  • 那么你为什么要使用 stat() 命令呢?我刚刚尝试使用 lstat() ,它似乎提供了相同的信息,除了它处理链接。仅当您知道自己不处理任何符号链接时才使用 stat() 吗?
  • 您在处理符号链接时也使用它,通常您不关心路径是常规文件还是链接,您关心的是使用的文件。例如链接的 mtime 是完全无趣的,链接指向的文件的 mtime 是。
  • stat() 确实 处理链接,它只是以不同的方式处理它们 - 它跟随链接并告诉您它指向的文件(正如 wich 指出的那样,通常是你想要的)。
  • 当您希望链接以“正常方式”运行时使用 stat(),即作为它们指向的文件。只有需要区分链接和非链接的应用程序才需要使用 lstat()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2012-02-28
  • 2013-12-23
相关资源
最近更新 更多