флаги для st_mode системного вызова stat - PullRequest
7 голосов
/ 30 июня 2011

Я пытаюсь понять флаги для поля st_mode структуры stat этой команды stat, но у меня такие трудные времена!Я нашел этот пример здесь , но я действительно не понимаю этот фрагмент кода:

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: Извините за предыдущие вопросы, которые я задавал.Я не знаю, как пометить ответ на вопрос или что-то в этом роде: (

Ответы [ 3 ]

3 голосов
/ 30 июня 2011
Режим

- это битовое поле , которое является распространенным способом упаковки данных. Думайте о каждом бите в поле как о тумблере, который можно отключить или включить. Чтобы проверить, включено ли переключение, проверьте, был ли установлен соответствующий бит с помощью оператора &. Вы можете установить биты, используя | и очистите их, используя ~ побитовые операции .

2 голосов
/ 30 июня 2011

В программировании операционной системы часто используются целые числа без знака для хранения последовательности битов, которые что-то описывают. В этом случае режим имеет 9 бит интереса. Один бит сообщает, может ли владелец читать, один - для записи владельца, один - для выполнения владельца и аналогичные биты для группы и другие. Хитрость в том, чтобы узнать, установлен бит или нет.

Вот пример. S_IRUSR - это имя для битовой маски, которая описывает бит «чтения владельца». Он определен в в спецификациях как 0400 (восьмеричное), что переводится в 100000000 в двоичном виде. Когда вы берете двоичный код и этого значения с маской, вы получаете значение 100000000 (двоичный код), если установлен 9-й бит маски. В противном случае вы получите 0.

Оператор if оценивается как true, если возвращается большое значение, и false в противном случае. Таким образом, если бит установлен, 'r' записывается в строку в позицию 1. Тот же метод применяется и ко всем остальным битам.

2 голосов
/ 30 июня 2011

Ну, спецификация POSIX для <sys/stat.h> перечисляет все, что вы можете узнать из поля st_mode struct stat.

Является ли ваш вопрос "Что мне может сказать это поле" или "Как мне извлечь информацию", или оба?

...