bool FileLock::TryLock()
{
if (fd == -1) {
return false;
}
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
if (fcntl(fd, F_SETLK, &lock) == -1) {
reason = GetErrorReason();
return false;
}
return true;
}
同時有一個細節就是
LockResult LockDirectory(const fs::path& directory, const fs::path& lockfile_name, bool probe_only)
可以選擇probe_only,即嘗試獲取鎖在獲取後立即釋放,作用是如果啟動比特幣選擇了 -daemon, 比特幣將在初始化之後fork建立daemon程序,
可以選擇probe_only,即嘗試獲取鎖在獲取後立即釋放,作用是如果啟動比特幣選擇了 -daemon, 比特幣將在初始化之後fork建立daemon程序,
如果在fork前獲取鎖會導致父子程序同時持有鎖,導致問題。