Ete*_*ner 12 c linux symlink system-calls stat
我有下面的代码,这里只显示了它的一部分,我正在检查文件的类型.
struct stat *buf /* just to show the type buf is*/
switch (buf.st_mode & S_IFMT) {
case S_IFBLK: printf(" block device\n"); break;
case S_IFCHR: printf(" character device\n"); break;
case S_IFDIR: printf(" directory\n"); break;
case S_IFIFO: printf(" FIFO/pipe\n"); break;
case S_IFLNK: printf(" symlink\n"); break;
case S_IFREG: printf(" regular file\n"); break;
case S_IFSOCK: printf(" socket\n"); break;
default: printf(" unknown?\n"); break;
}
Run Code Online (Sandbox Code Playgroud)
问题:st_mode
当我做printf("\nMode: %d\n",buf.st_mode);
结果时获得的值是33188.
我用常规文件类型和符号链接测试了我的程序.在这两种情况下,输出都是"常规文件",即符号链接情况失败,我不明白为什么?
pax*_*blo 20
从stat (2)
手册页:
stat()
由路径指向并填写的文件的统计信息buf
.
lstat()
是相同的stat()
,不同之处在于,如果路径是符号链接,则链接本身是STAT-ED,而不是它是指该文件.
换句话说,该stat
调用将遵循指向目标文件的符号链接并检索该信息.请尝试使用lstat
,它将为您提供链接的信息.
如果您执行以下操作:
touch junkfile
ln -s junkfile junklink
Run Code Online (Sandbox Code Playgroud)
然后编译并运行以下程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
你会得到:
stat says file
lstat says link
Run Code Online (Sandbox Code Playgroud)
正如所料.
归档时间: |
|
查看次数: |
13447 次 |
最近记录: |