パス名引数がディレクトリなのか、実行権限を持つ一般的なファイルなのか、一般的なファイルなのか、シンボリックリンクなのかを印刷する簡単なプログラムがあります。
これを決定するには、次の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_IFDIR
S
F
これは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です。