如何确定使用stat()文件是否是符号链接?

hor*_*ora 15 c symlink inode

我基本上必须为一个类写一个UNIX ls命令的克隆,而且几乎所有东西都在工作.我似乎无法弄清楚如何做的一件事是检查文件是否是符号链接.从手册页中stat(),我看到有一个mode_t定义的值,S_IFLNK.

这就是我试图检查一个文件是否是一个sym-link,没有运气(注意,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;
}
Run Code Online (Sandbox Code Playgroud)

我的代码总是打印,this is not a link即使它是,并且我知道所述文件是符号链接,因为实际的ls命令是这样说的,而且我创建了sym-link ...

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

unw*_*ind 24

你不能.

您需要使用lstat()stat来统计链接本身,plain stat()将跟随链接,因此永远不会"看到"链接本身.

  • 在处理符号链接时也使用它,通常你不关心路径是常规文件还是链接,你关心使用的文件.例如,链接的mtime完全不感兴趣,链接所指向的文件的mtime是. (3认同)
  • `stat()`*做*处理链接,它只是处理它们不同 - 它跟随链接并告诉你它指向的文件(正如你所指出的那样,通常是你想要的). (2认同)
  • 当您希望链接以"正常方式"运行时,即使用它们指向的文件时,可以使用stat().只有需要区分链接和非链接的应用程序才需要使用lstat(). (2认同)