// 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
用于fcntl
控制锁定文件。取决于你在做什么,不同的锁将被创建
apt
,让我们考虑sudo apt update
哪个apt-pkg/update.cc
负责,并在实际更新我们的源列表之前运行这个条件:请注意,
_config->FindDir("Dir::State::Lists")
将返回:/lists
,您可以通过运行:因此
GetLock()
将在 中创建一个锁定文件/var/lib/apt/lists/
,如果我运行另一个sudo apt update
进程,我将得到:GetLock()
本身居住在这里apt-pkg/contrib/fileutl.cc
:我们来看看它的评论:
所以下次当我运行
apt update
这个函数而不是创建锁定文件时,将返回-1
并且我们的条件失败并且我们收到一个错误。如果我们查看 的代码,
GetLock
我们可以看到它fcntl
用于提供其功能。基本上
fileutl.cc
是一个包含两个主要功能的文件实用程序,它定义GetLock
为“dpkg 兼容锁定文件操作”方法。fcntl
本身提供了一堆系统调用来操作文件描述符。提供的功能之一fcntl
是“ POSIX 记录锁,也称为进程关联锁”:而且我相信你已经知道使用锁定文件背后的想法,但要确保来到这里的每个人都知道它:
锁定文件的目的是什么?
Apt 和 dpkg 使用 lockfiles (in
/var/lib/
, not/var/cache
) 来确保包管理操作和包数据库正确同步。这意味着如果您安装或删除一个包(如
hello
包),包数据库将是准确的,并且您的包管理器将正确显示包的正确状态。有几种可能的解决方案可以确保包管理操作和包数据库同步。锁定文件是 apt 开发人员选择的解决方案……主要是因为它是一种简单、易于排除故障且易于理解的解决方案。