2

ここで何が間違っているのですか、それとも 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() はこれら 2 つを区別できるはずですが、そうではありません。

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
4

1 に答える 1

8

シンボリック リンク自体で stat を実行する場合は、lstat()代わりに使用することをお勧めします。stat()

man statもっている

lstat() は stat() と同じですが、path がシンボリック リンクの場合、参照先のファイルではなく、リンク自体が stat される点が異なります。

于 2013-05-29T13:56:40.203 に答える