Во время смены пароля с помощью команды passwd файл shadow заблокирован от изменения другим процессом.
326 12:45:36 open("/etc/.pwd.lock", O_WRONLY|O_CREAT|O_CLOEXEC, 0600) = 4 [0.000028] . . 326 12:45:36 fcntl(4, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}) = 0 [0.000032]
Файл /etc/.pwd.lock используется следующими функциями для блокировки или разблокировки файла /etc/shadow во время смены пароля.
1. lckpwdf ()
Функция lckpwdf () предназначена для защиты от множественного одновременного доступа к базе данных паролей shadow.
Он пытается получить блокировку и возвращает 0 в случае успеха или -1 при ошибке (блокировка не получена в течение 15 секунд).
2. ulckpwdf()
Функция ulckpwdf () снова снимает блокировку.
Обратите внимание, что нет защиты от прямого доступа к файлу паролей. Только программы, использующие lckpwdf (), заметят блокировку.
Блокировка устанавливается с помощью команды F_WRLCK.
Команда означает, что, если какой-либо процесс уже имеет блокировку файла, он будет ожидать снятия блокировки. Обратитесь к функции ниже.
3. F_SETLKW
Эта команда такая же, как F_SETLK, за исключением того, что если общая или монопольная блокировка заблокирована другими блокировками, поток будет ждать, пока запрос не будет выполнен.
Если сигнал, который должен быть перехвачен, получен, пока fcntl () ожидает область, fcntl () будет прерван.
По возвращении из обработчика сигнала fcntl () вернет -1 с errno, установленным в [EINTR], и операция блокировки не будет выполнена.