18

私は以下のコードを持っていますが、その一部のみがここに表示されており、ファイルのタイプかどうかを確認しています。

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;
}

問題:結果st_modeを実行したときに得られる値printf("\nMode: %d\n",buf.st_mode);は 33188 です。

通常のファイル タイプとシンボリック リンクを使用してプログラムをテストしました。どちらの場合も、出力は「通常のファイル」でした。つまり、シンボリック リンクのケースが失敗しており、その理由がわかりません。

4

1 に答える 1

36

stat (2)マニュアルページから:

stat()パスが指すファイルを統計し、を入力しますbuf

lstat()stat()パスがシンボリックリンクである場合、リンク自体が指定され、参照するファイルではないことを除いて、はと同じです。

つまり、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;
}

あなたが得るでしょう:

 stat says file
lstat says link

予想通り。

于 2010-10-21T07:07:24.190 に答える