如何检查软链接是否存在

use*_*571 4 c linux symlink

user: ls -lt
lrwxrwxrwx 1 user sw-team    9 Jun 18 19:01 new_link -> test/file
Run Code Online (Sandbox Code Playgroud)

我有一个像上面提到的软链接.我想检查是否存在new_link(不是链接文件).我尝试了以下所有内容,但只有在最终目标文件(测试/文件)存在时才会检查.

access(filename,F_OK)
stat()
open()
fopen()
Run Code Online (Sandbox Code Playgroud)

我想在C语言中找到它而不是在shell脚本中.请在检查链接文件之前告诉我如何找到new_link?

Jon*_*art 8

使用lstat- 获取符号链接状态:

除非路径指代符号链接,否则该lstat()函数应等效stat().在这种情况下,lstat()应返回有关链接的信息,同时stat()应返回有关链接引用的文件的信息.

(强调我的.)

lstat将返回非零,并且如果链接(或路径的任何其他部分)不存在,errno将设置为ENOENT.

例:

#include <stdio.h>
#include <stdbool.h>
#include <sys/stat.h>

bool symlink_exists(const char* path)
{
    struct stat buf;
    int result;

    result = lstat(path, &buf);

    return (result == 0);
}

void test(const char* path)
{
    bool exists = symlink_exists(path);

    printf("%s does%s exist.\n", path, exists ? "" : " not");
}

int main(int argc, char** argv)
{
    test("/bin/sh");
    test("/etc/no_such_thing");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

/bin/sh does exist.
/etc/no_such_thing does not exist.
Run Code Online (Sandbox Code Playgroud)