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