ВЫБОР СЛАБОЙ ИЛИ СИЛЬНОЙ БЛОКИРОВКИ
По причинам, описанным ниже (см. Сильная блокировка. Некоторые предупреждения), использование сильной блокировки не рекомендуется. Будет ли задействован контроль блокировки при любых системных вызовах, обслуживающих ввод-вывод, выясняется в момент этих вызовов в зависимости от режима доступа к файлу [см. chmod(2)]. Чтобы такой контроль осуществлялся, файл должен быть обычным, со взведенным битом переустановки идентификатора группы и без права на выполнение членами группы. Если эти условия не выполняются, все блокировки сегментов будут слабыми. Сильная блокировка может быть обеспечена следующим исходным текстом:
#include <sys/types.h> #include <sys/stat.h>
int mode; struct stat buf; . . . if (stat (filename, &buf) < 0) { perror ("программа"); exit (2); } /* Получение текущего режима доступа */ mode = buf.st_mode; /* Удаление разрешения на выполнение членами группы */ mode &= (S_IEXEC >> 3); /* Взведение бита переустановки идентификатора группы */ mode |= S_ISGID; if (chmod (filename, mode) < 0) { perror ("программа"); exit (2); } . . .
С файлами, в которых должны блокироваться сегменты, не должно быть связано каких бы то ни было прав на выполнение. Это требование вызвано тем, что операционная система не поддерживает протокол блокировки сегментов при выполнении файла.
Помимо рассмотренного способа, сильная блокировка файла может быть легко установлена с использованием утилиты chmod(1):
chmod +l файл
Утилита ls(1) также была изменена с тем, чтобы при запросе с опцией -l отображать установленный режим блокировки. В результате выполнения запроса
ls -l f1
будет выведена строка вида
-rw---l--- 1 abc other 1576 Dec 3 11:44 f1