7

その stat コマンドの stat 構造体の st_mode フィールドのフラグを理解しようとしていますが、とても苦労しています! この例は hereで見つかりましたが、このコードフラグメントを本当に理解していません:

if ( mode & S_IRUSR ) str[1] = 'r';    /* 3 bits for user  */
if ( mode & S_IWUSR ) str[2] = 'w';
if ( mode & S_IXUSR ) str[3] = 'x';

if ( mode & S_IRGRP ) str[4] = 'r';    /* 3 bits for group */
if ( mode & S_IWGRP ) str[5] = 'w';
if ( mode & S_IXGRP ) str[6] = 'x';

if ( mode & S_IROTH ) str[7] = 'r';    /* 3 bits for other */
if ( mode & S_IWOTH ) str[8] = 'w';
if ( mode & S_IXOTH ) str[9] = 'x';

「&」がビットごとの AND 演算子であることは知っていますが、他には何もありません。何を尋ねたらいいのかもわかりません。

PD: 以前の質問で申し訳ありません。質問に回答済みなどのマークを付ける方法がわかりません:(

4

3 に答える 3

3

mode は、データをパックする一般的な方法であるビットフィールドです。フィールド内の各ビットを、オフまたはオンに設定できるトグル スイッチと考えてください。トグルがオンになっているかどうかを確認するには、& 演算子を使用して適切なビットが設定されているかどうかを確認します。| を使用してビットを設定できます。〜ビットごとの操作を使用してそれらをクリアします。

于 2011-06-30T02:18:02.593 に答える
2

そうですね、 のPOSIX 仕様は<sys/stat.h>、 の st_mode フィールドから学べるすべてのことを列挙していますstruct stat

あなたの質問は「このフィールドは何を教えてくれますか」ですか、それとも「情報をどのように抽出するのですか」、あるいはその両方ですか?

于 2011-06-30T02:29:07.860 に答える
2

オペレーティング システムのプログラミングでは、何かを説明する一連のビットを保持するために符号なし整数を使用するのが一般的です。この場合、モードには対象となる 9 ビットがあります。1 つのビットは、所有者が読み取り可能かどうかを示し、1 つは所有者の書き込み用、もう 1 つは所有者の実行用であり、同様のビットはグループおよびその他のものです。トリックは、ビットが設定されているかどうかを抽出することです。

これが例です。S_IRUSR は、「所有者読み取り」ビットを記述するビットマスクの名前です。仕様では 0400 (8 進数) として定義され ており、これは 2 進数で 100000000 に変換されます。マスクを使用してバイナリとこの値を取得すると、マスクの 9 番目のビットが設定されている場合、値 100000000 (バイナリ) が得られます。それ以外の場合は 0 になります。

大きな値が返された場合、if ステートメントは true に評価され、それ以外の場合は false に評価されます。このように、ビットが設定されている場合、「r」が文字列の位置 1 に書き込まれます。同じ手法が他のすべてのビットにも適用されます。

于 2011-06-30T05:14:14.633 に答える