Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Lock file linux

Linux Lock Files

Often times, running processes on a Linux system need to coordinate their operations to prevent conflicts or race conditions. For example, two processes may need to safely access a shared resource or a cron job may need to verify that a previous instance has completed before running again. Processes generally use the concept of file locking to serialize their actions. Cooperating processes acquire a lock on a lock file to indicate that it is their turn to run or manipulate a shared resource. The contents of the lock file is irrelevant; they exist purely to indicate that a resource is occupied.

Linux systems offer two kinds of locks: exclusive, or write, locks and shared, or read, locks. These locks behave differently:

  • If a process holds an exclusive lock on a file, then no other process can acquire a lock, shared or exclusive, on that file.
  • If a process holds a shared lock on a file, then no other process can acquire an exclusive lock on that file.
  • Multiple processes can hold a shared lock on a file simultaneously.

These locks are advisory on Linux systems, meaning that all processes must agree to respect locks held by a process. There are no safeguards to prevent an uncooperative process from ignoring a lock.

A (forced?) analogy

A lock file can be thought of as a record player. While someone is putting on a record (obtaining an exclusive lock):

  • No one else in the room can listen to the music (obtain a shared lock).
  • No one else can pick out their own record to play (obtain an exclusive lock).

Similarly, when everyone is listening to the music:

  • Anyone else can listen to the music (obtain a shared lock), too.
  • Anyone wanting to put on a different record (obtain an exclusive lock) must wait for everyone else to finish listening, first.

Locking files with flock

One common way to lock a file on a Linux system is flock . The flock command can be used from the command line or within a shell script to obtain a lock on a file and will create the lock file if it doesn’t already exist, assuming the user has the appropriate permissions. Some possible flags for flock are below:

  • -x Acquire an exclusive lock on a file (the default)
  • -s Acquire a shared lock on a file
  • -n Fail by exiting with an exit code of 1 instead of waiting if a lock on a file is not available
  • -w seconds If a lock is not available, wait a specified number of seconds before exiting with an exit code of 1
  • -u Drop a lock. A lock is typically dropped when the lock file is closed, so this flag is generally only needed in special cases

Using flock in a shell script

The flock command can be used in a shell script as follows:

These two scripts are nearly identical: the first one attempts to acquire an exclusive lock while the second one attempts to acquire a shared lock. When used this way, flock takes a file descriptor: 200 in this example. The script attempts to obtain the lock in a non-blocking way, meaning that the script will exit immediately with an exit code of 1 if the lock is not available. It then opens /var/lock/lockfile and assigns the file descriptor 200 to it. The trap statement isn’t needed for acquiring the lock, but ensures that the lock file is removed upon successful completion of the code block.

These scripts also show the advisory nature of file locking on Linux systems. The script itself is responsible for checking the return value of the flock statement and handle it appropriately.

Example 1: Acquiring an exclusive lock

In three terminals, run exclusive_lock.sh in the first, exclusive_lock.sh again in the second, and shared_lock.sh in the third. The output should look similar to the following:

Here, the first run of exclusive_lock.sh acquired an exclusive lock on /var/lock/lockfile and executed its sleep statement. Since the lock was already taken, neither the second run of exclusive_lock.sh nor the run of shared_lock.sh were able to obtain the lock and exited with an exit code of 1.

Example 2: Acquiring a shared lock

In three terminals, run shared_lock.sh in the first, shared_lock.sh in the second, and exclusive_lock.sh in the third. The output should look like the following:

The first run of shared_lock.sh acquired a shared lock on /var/lock/lockfile . Since multiple shared locks can exist simultaneously, the second run of shared_lock.sh also obtained a lock. However, since an exclusive lock cannot be obtained while a shared lock exists, the run of exclusive_lock.sh exited with an exit code of 1.

Share on

Linux Lock Files was published on May 18, 2015 and last modified on May 19, 2015 .

lockfile(1) — Linux man page

lockfile — conditional semaphore-file creator

Synopsis

Description

lockfile can be used to create one or more semaphore files. If lockfile can’t create all the specified files (in the specified order), it waits sleeptime (defaults to 8) seconds and retries the last file that didn’t succeed. You can specify the number of retries to do until failure is returned. If the number of retries is -1 (default, i.e., -r-1) lockfile will retry forever.

If the number of retries expires before all files have been created, lockfile returns failure and removes all the files it created up till that point.

Using lockfile as the condition of a loop in a shell script can be done easily by using the -! flag to invert the exit status. To prevent infinite loops, failures for any reason other than the lockfile already existing are not inverted to success but rather are still returned as failures.

All flags can be specified anywhere on the command line, they will be processed when encountered. The command line is simply parsed from left to right.

All files created by lockfile will be read-only, and therefore will have to be removed with rm -f.

If you specify a locktimeout then a lockfile will be removed by force after locktimeout seconds have passed since the lockfile was last modified/created (most likely by some other program that unexpectedly died a long time ago, and hence could not clean up any leftover lockfiles). Lockfile is clock skew immune. After a lockfile has been removed by force, a suspension of suspend seconds (defaults to 16) is taken into account, in order to prevent the inadvertent immediate removal of any newly created lockfile by another program (compare SUSPEND in procmail(1)).

Mailbox locks If the permissions on the system mail spool directory allow it, or if lockfile is suitably setgid, it will be able to lock and unlock your system mailbox by using the options -ml and -mu respectively.

Examples

Suppose you want to make sure that access to the file «important» is serialised, i.e., no more than one program or shell script should be allowed to access it. For simplicity’s sake, let’s suppose that it is a shell script. In this case you could solve it like this: Now if all the scripts that access «important» follow this guideline, you will be assured that at most one script will be executing between the ‘lockfile’ and the ‘rm’ commands.

Environment

used as a hint to determine the invoker’s loginname

Files

to verify and/or correct the invoker’s loginname (and to find out his HOME directory, if needed) /var/spool/mail/$LOGNAME.lock

Читать еще:  Как исправить ошибку sxstrace

lockfile for the system mailbox, the environment variables present in here will not be taken from the environment, but will be determined by looking in /etc/passwd

See Also

Diagnostics

Use shorter filenames. Forced unlock denied on «x»

No write permission in the directory where lockfile «x» resides, or more than one lockfile trying to force a lock at exactly the same time. Forcing lock on «x»

Lockfile «x» is going to be removed by force because of a timeout (compare LOCKTIMEOUT in procmail(1)).

The system is out of swap space.

Lockfile will remove anything it created till now and terminate.

The retries limit has been reached. Truncating «x» and retrying lock

«x» does not seem to be a valid filename. Try praying, .

Missing subdirectories or insufficient privileges.

Definitely less than one.

Warnings

The behavior of the -! flag, while useful, is not necessarily intuitive or consistent. When testing lockfile’s return value, shell script writers should consider carefully whether they want to use the -! flag, simply reverse the test, or do a switch on the exact exitcode. In general, the -! flag should only be used when lockfile is the conditional of a loop.

Miscellaneous

Lockfile is NFS-resistant and eight-bit clean.

Notes

Calling up lockfile with the -h or -? options will cause it to display a command-line help page. Calling it up with the -v option will cause it to display its version information.

Multiple -! flags will toggle the return status.

Since flags can occur anywhere on the command line, any filename starting with a ‘-‘ has to be preceded by ‘./’.

The number of retries will not be reset when any following file is being created (i.e., they are simply used up). It can, however, be reset by specifying -rnewretries after every file on the command line.

Although files with any name can be used as lockfiles, it is common practice to use the extension ‘.lock’ to lock mailfolders (it is appended to the mailfolder name). In case one does not want to have to worry about too long filenames and does not have to conform to any other lockfilename convention, then an excellent way to generate a lockfilename corresponding to some already existing file is by taking the prefix ‘lock.’ and appending the i-node number of the file which is to be locked.

Source

This program is part of the procmail mail-processing-package (v3.22) available at http://www.procmail.org/ or ftp.procmail.org in pub/procmail/.

Mailinglist

There exists a mailinglist for questions relating to any program in the procmail package: If you would like to stay informed about new versions and official patches send a subscription request to (this is a readonly list).

Using Lock Files for Job Control in Bash Scripts

As a continuation of our series of Bash tutorials I thought it would be good to discuss lock files. The most common use of lock files is to ensure a second instance of a script does not run until the first is completed. Anytime you have multiple processes working with shared resources, using lock files will help avoid conflicts and race conditions.

It is important to point out that a lot of programming languages use lock files. For this tutorial we will be discussing their use for shell scripting. However, we believe that this information will be easily transferable to other languages.

Here is a real world example of how lock files could be used. A colleague of mine wrote a script that uses rsync over ssh to synchronize his workstation home directory to a shared directory on a server. He set the cron job to run this script every hour. This was fine for the first month or so, but one day he was copying a bunch of logs and several large ISO files to his home directory. This influx of data caused the rsync script to run longer than one hour. Before it could complete cron kicked off a second instance of the script. This slowed down the copy job which then caused a third instance to kick off, then a fourth, and so on. Before he knew it his workstation was unusable. Using a lock file could have help avoid this scenario.

In this tutorial we will discuss the basics of using lock files. We will discuss creating a basic lock files as well as using the flock utility to manage lock files and queuing.

Table of Contents

Creating a Basic Lock File

A basic lock file is when you create a file to be used as a lock. The existence of the file will be a signal to any subsequent instance of the script not to run. When the script exits, you delete the file. The next instance of the script will check for the existence of the file to determine if it is safe to execute.

Here is some example code:

Thanks to David for the updated code.

In the above example, we are using a simple if statement to check if a file exists. If the file exist, the script exits (cannot get lock). If the file does NOT exist, it creates the file and a trap to delete the file on exit then continues.

Here is a our script in action. I will kick off the script and then send it to the background. I will then attempt to run the script again, at which point it should exit because the lock file exists.

There you have a simple lock. If the script runs a second time and sees the file is created, it will exit.

NOTE: In my opinion it is important to use a trap to delete the file instead of using a simple «rm » at the end of the script. We spoke in depth about the advantages of using traps in «Using Trap to Exit Bash Scripts Cleanly».

Using flock to Create Lock Files

Flock is the name of both a kernel level system call and a command line utility. The latter is simply a way to manage the systems calls from shell scripts or the command line.

The flock command works on file descriptors, not files. A file descriptor is a unique number used to access a data resource. The most popular file descriptors are 1 (standard input), 2 (standard output) and 3 (standard error). Which were described in «Introduction to Linux IO, Standard Streams, and Redirection».

In Unix and related computer operating systems, a file descriptor (FD, less frequently fildes) is an abstract indicator (handle) used to access a file or other input/output resource, such as a pipe or network socket. File descriptors form part of the POSIX application programming interface.

Using flock to Queue Jobs

One of the major advantages of using flock over a simple lock file is the ability to queue, or wait for a lock. By default flock will wait indefinitely to get a lock unless you use the -n (nonblock) option.

Here is the code we will use as our test script.

Let’s take a deeper look at the two important lines that make up the lock.

This redirects the file descriptor 100 to the desired lock file. Using exec ensures the redirect is available for the life of the shell. The «|| exit 1» instructs the script to exit if the exec command fails.

Читать еще:  Как исправить ошибку video tdr failure

The above line obtains a lock on file descriptor 100. Basically holding a lock on the file until the shell closes. Since scripts run in a sub-shell, the file will be closed (or unlocked) when the script exits. The «|| exit 1» instructs the script to exit if a lock cannot be obtained.

That’s it, we just created a file lock using flock. It’s pretty straight forward once you wrap your head around it.

Using Wait or Timeout for Queued Jobs

You also have the option of waiting x number of seconds to acquire a lock before failing.

Let’s take this example.

Here we are using the -w (wait) option for flock and giving it a value of 10. This instructed flock to fail if the lock cannot be acquired in 10 seconds. Since the script should only take 5-6 seconds to run, we should be able to acquire a lock before the timeout. Let’s test it out.

As you can see in the example above, flock waited until the script released the lock. Then the second instance of the script acquired the lock and executed.

Timeouts are a good way to ensure you don’t have a bunch of scripts waiting for some hung up resource to drop a lock.

Do Not Queue Jobs While Using flock

As we mentioned above, the default behavior of flock is to wait indefinitely to acquire a lock. We also discussed using the -w (timeout) option to set a time limit on how long it will wait. Conversely, you can use the -n (nonblock) option to instantly fail if it cannot immediately acquire a lock.

Below you will see that I background the first instance of the test.sh script. I then try to run a second instance and it fails instantly instead of waiting for a lock.

Additionally, the -E (conflict-exit-code) can be set to use a custom exit code. This option is only used with the nonblock option or the timeout option, since flock will otherwise wait indefinitely for a lock.

Exclusive Lock vs Shared Lock

There are two kinds of locks, exclusive (AKA write lock) and shared (AKA read lock).

  • If an exclusive lock is taken, no other process can take a lock, exclusive or shared, on that file.
  • If a shared lock is taken, other processes may take a shared lock on the same file, but no processes may take an exclusive lock.

The flock utility in Linux will take an exclusive lock by default. You must specify your desire for shared lock by using the -s (shared) option.

Cleaning Up flock Lock Files

Deleting the lock files created when using flock is not necessary since flock doesn’t use the existence of the file as an indicator. However it is probably a good idea to keep a file system tidy.

You can use a trap to delete lock files, just as we did with the basic lock file.

Conclusion

In this article we touched on all the basics of creating a lock file and how to use them in shell scripts. We discussed creating a basic lock file and locking files with flock. This should be enough information to get you started effectively using lock files. I will link to the pertinent man pages and some good bash scripting resources below for additional information.

If you enjoyed this article please consider showing your support by following us on Twitter, Facebook and subscribing to our Newsletter.

Cтруктура файловой системы Linux

Понимание файловой системы Linux, структуры каталогов, размещения конфигурационных, исполняемых и временных файлов поможет вам лучше разбираться в своей системе и стать успешным системным администратором. Файловая система Linux будет непривычна именно для новичка, только что перешедшего с Windows, ведь здесь все совсем по-другому. В отличие от Windows, программа не находится в одной папке, а, как правило, распределена по корневой файловой системе. Это распределение поддается определенным правилам. Вы когда-нибудь задавались вопросом, почему некоторые программы находятся в папке /bin, или /sbin, /usr/sbin, /usr/local/bin, в чем разница между этими каталогами?

Например, программа less, находится в каталоге /usr/bin, но почему не в /sbin или /usr/sbin. А такие программы, как ifconfig или fdisk находятся в каталоге /sbin и нигде иначе.

В этой статье будет полностью рассмотрена структура файловой системы Linux, после ее прочтения вы сможете понять смысл использования большинства папок в корневом каталоге Linux.

/ — корень

Это главный каталог в системе Linux. По сути, это и есть файловая система Linux. Здесь нет дисков или чего-то подобного, как в Windows. Вместо этого, адреса всех файлов начинаются с корня, а дополнительные разделы, флешки или оптические диски подключаются в папки корневого каталога.

Только пользователь root имеет право читать и изменять файлы в этом каталоге.

Обратите внимание, что у пользователя root домашний каталог /root, но не сам /.

/bin — (binaries) бинарные файлы пользователя

Этот каталог содержит исполняемые файлы. Здесь расположены программы, которые можно использовать в однопользовательском режиме или режиме восстановления. Одним словом, те утилиты, которые могут использоваться пока еще не подключен каталог /usr/. Это такие общие команды, как cat, ls, tail, ps и т д.

/sbin — (system binaries) системные исполняемые файлы

Так же как и /bin, содержит двоичные исполняемые файлы, которые доступны на ранних этапах загрузки, когда не примонтирован каталог /usr. Но здесь находятся программы, которые можно выполнять только с правами суперпользователя. Это разные утилиты для обслуживания системы. Например, iptables, reboot, fdisk, ifconfig,swapon и т д.

/etc — (etcetera) конфигурационные файлы

В этой папке содержатся конфигурационные файлы всех программ, установленных в системе.

Кроме конфигурационных файлов, в системе инициализации Init Scripts, здесь находятся скрипты запуска и завершения системных демонов, монтирования файловых систем и автозагрузки программ. Структура каталогов linux в этой папке может быть немного запутанной, но предназначение всех их — настройка и конфигурация.

/dev — (devices) файлы устройств

В Linux все, в том числе внешние устройства являются файлами. Таким образом, все подключенные флешки, клавиатуры, микрофоны, камеры — это просто файлы в каталоге /dev/. Этот каталог содержит не совсем обычную файловую систему. Структура файловой системы Linux и содержащиеся в папке /dev файлы инициализируются при загрузке системы, сервисом udev. Выполняется сканирование всех подключенных устройств и создание для них специальных файлов. Это такие устройства, как: /dev/sda, /dev/sr0, /dev/tty1, /dev/usbmon0 и т д.

/proc — (proccess) информация о процессах

Это тоже необычная файловая система, а подсистема, динамически создаваемая ядром. Здесь содержится вся информация о запущенных процессах в реальном времени. По сути, это псевдофайловая система, содержащая подробную информацию о каждом процессе, его Pid, имя исполняемого файла, параметры запуска, доступ к оперативной памяти и так далее. Также здесь можно найти информацию об использовании системных ресурсов, например, /proc/cpuinfo, /proc/meminfo или /proc/uptime. Кроме файлов в этом каталоге есть большая структура папок linux, из которых можно узнать достаточно много информации о системе.

/var (variable) — Переменные файлы

Название каталога /var говорит само за себя, он должен содержать файлы, которые часто изменяются. Размер этих файлов постоянно увеличивается. Здесь содержатся файлы системных журналов, различные кеши, базы данных и так далее. Дальше рассмотрим назначение каталогов Linux в папке /var/.

/var/log — Файлы логов

Здесь содержатся большинство файлов логов всех программ, установленных в операционной системе. У многих программ есть свои подкаталоги в этой папке, например, /var/log/apache — логи веб-сервера, /var/log/squid — файлы журналов кеширующего сервера squid. Если в системе что-либо сломалось, скорее всего, ответы вы найдете здесь.

Читать еще:  Процессы в linux

/var/lib — базы данных

Еще один тип изменяемых файлов — это файлы баз данных, пакеты, сохраненные пакетным менеджером и т д.

/var/mail — почта

В эту папку почтовый сервер складывает все полученные или отправленные электронные письма, здесь же могут находиться его логи и файлы конфигурации.

/var/spool — принтер

Изначально, эта папка отвечала за очереди печати на принтере и работу набора программ cpus.

/var/lock — файлы блокировок

Здесь находятся файлы блокировок. Эти файлы означают, что определенный ресурс, файл или устройство занят и не может быть использован другим процессом. Apt-get, например, блокирует свою базу данных, чтобы другие программы не могли ее использовать, пока программа с ней работает.

/var/run — PID процессов

Содержит файлы с PID процессов, которые могут быть использованы, для взаимодействия между программами. В отличие от каталога /run данные сохраняются после перезагрузки.

/tmp (temp) — Временные файлы

В этом каталоге содержатся временные файлы, созданные системой, любыми программами или пользователями. Все пользователи имеют право записи в эту директорию.

Файлы удаляются при каждой перезагрузке. Аналогом Windows является папка WindowsTemp, здесь тоже хранятся все временные файлы.

/usr — (user applications) Программы пользователя

Это самый большой каталог с большим количеством функций. Тут наиболее большая структура каталогов Linux. Здесь находятся исполняемые файлы, исходники программ, различные ресурсы приложений, картинки, музыку и документацию.

/usr/bin/ — Исполняемые файлы

Содержит исполняемые файлы различных программ, которые не нужны на первых этапах загрузки системы, например, музыкальные плееры, графические редакторы, браузеры и так далее.

/usr/sbin/

Содержит двоичные файлы программ для системного администрирования, которые нужно выполнять с правами суперпользователя. Например, таких как Gparted, sshd, useradd, userdel и т д.

/usr/lib/ — Библиотеки

Содержит библиотеки для программ из /usr/bin или /usr/sbin.

/usr/local — Файлы пользователя

Содержит файлы программ, библиотек, и настроек созданные пользователем. Например, здесь могут храниться программы собранные и установленные из исходников и скрипты, написанные вручную.

/home — Домашняя папка

В этой папке хранятся домашние каталоги всех пользователей. В них они могут хранить свои личные файлы, настройки программ и т д. Например, /home/sergiy и т д. Если сравнивать с Windows, то это ваша папка пользователя на диске C, но в отличии от WIndows, home как правило размещается на отдельном разделе, поэтому при переустановке системы все ваши данные и настройки программ сохранятся.

/boot — Файлы загрузчика

Содержит все файлы, связанные с загрузчиком системы. Это ядро vmlinuz, образ initrd, а также файлы загрузчика, находящие в каталоге /boot/grub.

/lib (library) — Системные библиотеки

Содержит файлы системных библиотек, которые используются исполняемыми файлами в каталогах /bin и /sbin.

Библиотеки имеют имена файлов с расширением *.so и начинаются с префикса lib*. Например, libncurses.so.5.7. Папка /lib64 в 64 битных системах содержит 64 битные версии библиотек из /lib. Эту папку можно сравнить с WIndowssystem32, там тоже сгружены все библиотеки системы, только там они лежат смешанные с исполняемыми файлами, а здесь все отдельно.

/opt (Optional applications) — Дополнительные программы

В эту папку устанавливаются проприетарные программы, игры или драйвера. Это программы созданные в виде отдельных исполняемых файлов самими производителями. Такие программы устанавливаются в под-каталоги /opt/, они очень похожи на программы Windows, все исполняемые файлы, библиотеки и файлы конфигурации находятся в одной папке.

/mnt (mount) — Монтирование

В этот каталог системные администраторы могут монтировать внешние или дополнительные файловые системы.

/media — Съемные носители

В этот каталог система монтирует все подключаемые внешние накопители — USB флешки, оптические диски и другие носители информации.

/srv (server) — Сервер

В этом каталоге содержатся файлы серверов и сервисов. Например, могут содержаться файлы веб-сервера apache.

/run — процессы

Еще один каталог, содержащий PID файлы процессов, похожий на /var/run, но в отличие от него, он размещен в TMPFS, а поэтому после перезагрузки все файлы теряются.

/sys (system) — Информация о системе

Назначение каталогов Linux из этой папки — получение информации о системе непосредственно от ядра. Это еще одна файловая система организуемая ядром и позволяющая просматривать и изменить многие параметры работы системы, например, работу swap, контролировать вентиляторы и многое другое.

Выводы

Теперь структура файловой системы Linux не кажется вам темным лесом. Конечно еще есть с чем разбираться, одна только подсистема /proc, /sys или /dev чего стоит. Но база уже заложена. Если я что-то упустил — напишите в комментариях.

/dev/blog

25 нояб. 2015 г.

Файловые блокировки в Linux

Advisory locking

Рекоммендательные блокировки работают только тогда, когда процессы явно устанавливают или снимают блокировку. Они не влияют на процессы, которые ничего не знают о блокировках.

У всех блокировок есть два режима: exclusive и shared.

BSD locks (flock)

Это, в частности, позволяет избежать проблем с потоками (см. следующую секцию).

Однако, flock() не гарантирует атомарного переключения между режимами exclusive и shared. При изменении режима блокировки, flock() сначала отпускает ее, а затем ожидает возможности захватить ее с новым режимом.

POSIX record locks (fcntl)

  • любые (даже несвязанные) файловые дескрипторы, отктрытые для одного и того же файла одним и тем же процессом, ссылаются на одну и ту же блокировку;
  • как следствие, все потоки одного процесса также разделяют одну и ту же блокировку для каждого файла, т.к. имеют одинаковый pid;
  • вызов close() для любого из открытых для файла дескрипторов снимает блокировку с файла, не зависимо от того, через какой дескриптор она была установленна и остаются ли у процесса другие открытые дескрипторы для этого файла.
  • использовать open file description locks, которые доступны в современных ядрах Linux;
  • использовать record locks и избежать открытия процессом одного и того же файла блокировки через несколько файловых дескрипторов.
  • централизованно хранить все дескрипторы файлов блокировок, отрытые процессом, и не допускать открытия нескольких дескрипторов для одного файла;
  • ассоциировать с каждым дескриптором rw-mutex, например pthread_rwlock, и счетчик количества потоков, захвативших блокировку одновременно (он будет больше единицы только при захвате в shared mode);
  • для захвата блокировки сначала захватывать мьютекс и увеличивать счетчик; и только если счетчик был нулевой, захватывать и файловую блокировку;
  • для освобождения блокировки уменьшать счетчик и только если он стал нулевым, освобождать и файловую блокировку; затем освобождать мьютекс.

Open file description locks (fcntl)

Другими словами, эти блокировки сочетают в себе достоинства BSD locks (привязка к файловому дескриптору) и POSIX record locks (блокировка интервала, атомарное переключение режима).

Mandatory locking

В Linux также есть ограниченная поддержака обязательных блокировок:

  • обязательные блокировки задействуются только если они включены при монтировании раздела и для блокировки используются POSIX record locks;
  • после захвата exclusive или shared блокировки любые системные вызовы, изменяющие файл (например write(), truncate()) будут блокированы до тех пор, пока блокировка не будет отпущена;
  • после захвата exclusive блокировки, также буду блокироваться любые системные вызовы, читающие из файла.

Однако, реализация в Linux считается ненадежной, см. сецию «Mandatory locking» в fcntl(2):

  • возможны гонки при одновременном захвате блокировки и параллельном вызове write() или read();
  • возможны гонки при одновременном использовании с mmap().

Также, обязательные блокировки не решают проблемы, описанные в секции «Удаление и переименование» ниже.

Замечания

Обработка падений

Приятной особенностью всех видов блокировок (и flock() и fcntl()) является то, что блокировка автоматически снимается при завершении процесса, в том числе аварийном.

Другими словами, наличие блокировки гарантирует, что существует процесс, удерживающий ее.

Удаление и переименование

Ни рекоммендательные, ни обязательные блокировки не учитываются, когда выполняются вызовы unlink() или rename().

Также не получится устанавливать блокировку на каталог, из которого удаляется или перемещается файл, потому что блокировки можно устанавливать только на файлы.

В частности это означает, что с помощью обязательных блокировок невозможно защитить файл от удаление или перемещения.

Ссылка на основную публикацию
Adblock
detector