Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何确定文件是否为链接?_C_Linux_Symlink_System Calls_Stat - Fatal编程技术网

C 如何确定文件是否为链接?

C 如何确定文件是否为链接?,c,linux,symlink,system-calls,stat,C,Linux,Symlink,System Calls,Stat,我有下面的代码,这里只显示了其中的一部分,我正在检查文件类型是否正确 struct stat*buf/*只是为了显示类型buf是*/ 开关(buf.st_模式和S_IFMT){ 案例S_IFBLK:printf(“块设备”);中断; 案例S_IFCHR:printf(“字符设备”);中断; 案例S_IFDIR:printf(“目录”);break; 案例S_IFFO:printf(“FIFO/管道”);中断; 案例S_iFlink:printf(“符号链接”);中断; 案例S_IFREG:pri

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

struct stat*buf/*只是为了显示类型buf是*/
开关(buf.st_模式和S_IFMT){
案例S_IFBLK:printf(“块设备”);中断;
案例S_IFCHR:printf(“字符设备”);中断;
案例S_IFDIR:printf(“目录”);break;
案例S_IFFO:printf(“FIFO/管道”);中断;
案例S_iFlink:printf(“符号链接”);中断;
案例S_IFREG:printf(“常规文件”);中断;
案例S_IFSOCK:printf(“套接字”);中断;
默认值:printf(“未知?\n”);中断;
}
问题:在执行
printf(“\n模式:%d\n”,buf.st\u模式)时获得的
st\u模式的值结果是33188

我用常规文件类型和符号链接测试了我的程序。在这两种情况下,输出都是“常规文件”,即符号链接案例失败,我无法理解原因?

从手册页:

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

lstat()

换句话说,
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;
}

正如所料。

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