Мне любопытно из как /var/cache/apt/archives/lock
используемый в apt-get
. Я узнал, что это - регулярный файл, и я думаю, что это используется путем вызова flock
на нем каждый раз apt-get
потребности внести некоторые изменения в /var/cache/apt/archives
.
Короткий ответ - это apt
использует fcntl
управлять файлами блокировки.
Зависьте от того, что Вы делаете, различные блокировки будут созданы apt
, давайте рассмотрим sudo apt update
который apt-pkg/update.cc
ответственно за и выполняет это условие прежде на самом деле обновить наши исходные списки:
if (Fetcher.GetLock(_config->FindDir("Dir::State::Lists")) == false)
Отметьте это _config->FindDir("Dir::State::Lists")
возвратится: /lists
, можно узнать это путем выполнения:
$ apt-config dump | grep lists
Dir::State::lists "lists/";
Так GetLock()
будет создавать файл блокировки в /var/lib/apt/lists/
, и если я выполняю другой sudo apt update
процесс я доберусь:
Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock ...
E: Unable to lock directory /var/lib/apt/lists/
GetLock()
самостоятельно жизни здесь в apt-pkg/contrib/fileutl.cc
:
Давайте взглянем на его комментарий:
// GetLock - Gets a lock file /*{{{*/
// ---------------------------------------------------------------------
/* This will create an empty file of the given name and lock it. Once this
is done all other calls to GetLock in any other process will fail with
-1. The return result is the fd of the file, the call should call
close at some time. */
В таким образом, следующий раз, когда я работаю apt update
эта функция вместо того, чтобы создать файл блокировки будет возвраты -1
и наше условие перестало работать, и мы получаем ошибку.
Если мы изучаем коды GetLock
мы видим, что это использует fcntl
обеспечить его технические возможности.
В основном fileutl.cc
утилита файла, содержащая две основных функции, которые определяют GetLock
как "dpkg совместимый метод" управления файлом блокировки.
fcntl
самостоятельно обеспечивает набор системных вызовов для управления дескрипторами файлов. Одна из технических возможностей, которой обеспечивают fcntl
"блокировки записи POSIX, также известные как блокировки, связанные с процессом":
man 2 fcntl
И я уверен, что Вы уже знаете идею позади использования файлов блокировки, но удостоверяться все, кто приезжает сюда, знают об этом:
Кв. и dpkg используют lockfiles (в /var/lib/
, нет /var/cache
) гарантировать, что действия управления пакетом и база данных пакета находятся правильно в синхронизации.
Это означает что, если Вы устанавливаете или удаляете пакет (как hello
пакет), база данных пакета будет точна, и Ваш диспетчер пакетов правильно покажет корректное состояние пакета.
Существует несколько возможных решений гарантировать, что действия управления пакетом и база данных пакета находятся в синхронизации. Lockfiles являются решением, которое способные разработчики выбрали... главным образом, потому что это - решение, которое просто, легко диагностировать, и легкий понять.