2015-11-19 4 views
-3

Я пытаюсь напечатать разрешения файлов в Linux с помощью stat вызова функции в C. И я нашел несколько полезных кода в Интернете, который имеет сегментыЧто такое & in fileStat.st_mode & S_IRUSR

printf((fileStat.st_mode & S_IRUSR) ? "r" : "-"); 
printf((fileStat.st_mode & S_IWUSR) ? "w" : "-"); 

код работает идеально, но может кто-нибудь объяснить мне, что же & значит здесь?

+2

Это побитовое и оператор – alain

+0

Спасибо! Я новичок в C. –

ответ

0

Первая линия

printf((fileStat.st_mode & S_IRUSR) ? "r" : "-");

Это печатает r если есть права на чтение (S_IRUSR) и - в противном случае.

Чтобы предотвратить против форматной строки атаки (https://en.wikipedia.org/wiki/Uncontrolled_format_string), вы должны написать:

printf("%c", (fileStat.st_mode & S_IRUSR) ? 'r' : '-');

Вторая линия

printf((fileStat.st_mode & S_IWUSR) ? "w" : "-");

Это печатает w если есть записи разрешений (S_IWUSR) и -. Опять же, чтобы предотвратить атаки форматной строки, вы должны написать:

printf("%c", (fileStat.st_mode & S_IWUSR) ? 'w' : '-');

& является побитовое и оператора. В этом случае он используется для проверки наличия битового поля. Переменная x могла быть установлена, например, A | B | C. Для того, чтобы проверить, если C немного дальше, писать

if (x & C) 
    // the bit has been set 
+0

Вы все еще не объяснили вопрос OP ** Что означает & ** ** – Michi

+0

Исправлено @Michi [15 символов] – stackptr

+0

... и вы получили мой голос за это: D. – Michi