ファイル統計プログラム[閉じる]

ファイル統計プログラム[閉じる]

パス名引数がディレクトリなのか、実行権限を持つ一般的なファイルなのか、一般的なファイルなのか、シンボリックリンクなのかを印刷する簡単なプログラムがあります。

これを決定するには、次のifステートメントがあります(mode_tモードはstruct statから派生します)。

if (mode & S_IFDIR){
    mode_s[n] = 'd';
} else if (is_user_exec(mode, ouid, ogid) && (mode & S_IFREG)){
    mode_s[n] = 'e';
}else if (mode & S_IFREG){
    mode_s[n] = 'f';
} else if (mode & S_IFLNK){
    mode_s[n] = 'l';
} else {
    mode_s[n] = 'o';
}

最初の3つはすべてうまくいきますが、「o」として分類する必要がある項目を渡すと「l」と表示されます。

私のコードがなぜこの問題を引き起こすのかを理解できる人はいますか?

ちなみに、私はこのプログラムをMINIX 3.2.1でコンパイルして実行していますが、問題の問題のあるパス名は/ dev / ptyp8です。

答え1

利用可能なMINIXシステムはありませんが、「モード」がさまざまなファイル形式に対して異なるビットを持たないことは問題であると確信しています。比較(代わりに)のS_ISDIR代わりに同様のマクロを使用する必要があります。S_IFDIRSFこれはGNU Cライブラリです

以下は、Linuxシステムの以前のバージョンです。先行は0値が8進数であることを意味します。

  #define S_ISDIR(m)    (((m) & S_IFMT) == S_IFDIR)

  #define S_IFMT  00170000
  #define S_IFSOCK 0140000
  #define S_IFLNK  0120000
  #define S_IFREG  0100000
  #define S_IFBLK  0060000
  #define S_IFDIR  0040000
  #define S_IFCHR  0020000

したがって、コードは(モード&0120000)が0でないことをテストしており、ビット0100000または020000が設定されている場合、そのビットはS_IFSOCK、S_IFLNK、S_IFREG、S_IFBLK、およびS_IFCHRに使用されます。あなたのpt型はS_IFCHRです。

関連情報