stat()无法正常工作?

时间:2013-05-29 13:54:05

标签: c ubuntu stat

我在这里做错了什么,或者Ubuntu 12.04(最新补丁)有什么问题?一般来说,我正在编写一段SUID代码来做一些这方面的工作,出于安全考虑,我想确保程序所针对的文件是一个常规文件,而不是其他东西,最明显的是符号链接。

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

我这里有一个带有常规文件和文件符号链接的目录。在我看来,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

1 个答案:

答案 0 :(得分:8)

如果您想对符号链接本身进行统计,则可能需要使用lstat()而不是stat()

man stat

  

lstat()与stat()相同,只是如果path是符号   链接,   然后链接本身被统计,而不是它引用的文件。