我在这里做什么错,还是Ubuntu 12.04(最新补丁)有问题?通常,我正在编写一段SUID代码来完成其中的一部分,出于安全原因,我想确保程序所针对的文件是常规文件,而不是其他文件,尤其是symlink。
visti@honecker:~/Project/Images$ ls -al
total 3080
drwxrwxr-x 2 visti visti 4096 May 29 14:18 .
drwxrwxr-x 4 visti visti 4096 May 29 14:42 ..
lrwxrwxrwx 1 visti visti 10 May 29 14:18 foo -> image-ntfs
-rw-rw-r-- 1 visti visti 3145728 May 28 16:17 image-ntfs
我在这里有一个包含常规文件的目录和指向该文件的符号链接(symbolic link)。我认为stat()应该能够区分这两者,但事实并非如此:
main (int argc, char **argv) {
int i;
struct stat buf;
if (argc < 2)
exit(1);
for (i = 1; i < argc ; i++) {
if (stat (argv[i], &buf) == -1) {
perror("foo");
exit(1);
}
printf ("%s,%d\n", argv[i], buf.st_mode & S_IFMT);
}
}
当我对目录运行编译后的程序时,这就是我得到的。这两个文件都只设置了S_IFREG。我究竟做错了什么?
visti@honecker:~/Project/Images$ ../stat *
foo,32768
image-ntfs,32768
最佳答案
如果要对符号链接(symbolic link)本身进行统计,则可能需要使用lstat()
而不是stat()
。man stat
有