В каком порядке система POSIX очищает блокировки файлов, которые не были разблокированы чисто? - PullRequest
4 голосов
/ 01 октября 2011

Спецификация POSIX для fcntl() гласит:

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

Является ли эта операция разблокировки блокировок сегмента файла, которые удерживались атомарно завершенным процессом для каждого файла?Другими словами, если процесс заблокировал байтовые сегменты B1..B2 и B3..B4 файла, но не разблокировал сегменты перед завершением, когда система может их разблокировать, это сегменты B1..B2 и B3..B4 оба разблокированы перед другой операцией fcntl() для блокировки сегмента файла?Если не атомарный для каждого файла, зависит ли порядок, в котором эти сегменты файлов разблокированы системой, от порядка, в котором были изначально получены сегменты файлов?

В спецификации для fcntl() не сказано, новозможно, в спецификации POSIX есть общее положение, предписывающее детерминированный порядок операций очищать после нечистого или аварийного завершения процесса.

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Частичный ответ есть в разделе 2.9.7 , «Взаимодействие потоков с обычными файловыми операциями» спецификации POSIX:

Все функции chmod () , закрыть () , fchmod ( ) , fcntl () , fstat () , ftruncate () , lseek () , открыто () , прочитано (), readlink () , stat () , символическая ссылка () , и запись () должна быть атомарной по отношению друг к другу в эффектах, указанных в стандарте IEEE 1003.1-2001, когда они работают с обычными файлами. Если каждый из двух потоков вызывает одну из этих функций, каждый вызов должен видеть все указанные эффекты другого вызова или ни одного из них.

Так, для обычного файла, если поток процесса удерживает блокировки на сегментах файла и вызывает close() на последнем дескрипторе файла, связанном с файлом, то последствия close() (включая удаление всех невыполненных блокировки на файл, которые удерживаются процессом) являются атомарными по отношению к эффектам вызова fcntl() потоком другого процесса для блокировки сегмента файла.

В спецификации для exit() указано:

Эти функции должны завершить вызывающий процесс со следующими последствиями:

  • Все дескрипторы файлов, потоки каталогов [, дескрипторы преобразования и дескрипторы каталога сообщений], открытые в вызывающем процессе, должны быть закрыты.

  • ...

Предположительно, дескрипторы открытых файлов закрываются , как если бы соответствующими вызовами close(), но, к сожалению, в спецификации не говорится, как дескрипторы открытых файлов "закрываются".

Спецификация 2004 года кажется еще более расплывчатой, когда речь идет об этапах ненормального завершения процесса. Единственное, что я смог найти - это документация на abort(). По крайней мере со спецификацией 2008 года на странице _Exit() есть раздел под названием Последствия завершения процесса . Тем не менее, формулировка по-прежнему:

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

ОБНОВЛЕНИЕ: Я только что открыл выпуск 0000498 в системе отслеживания дефектов Austin Group .

1 голос
/ 02 октября 2011

Я не думаю, что спецификация POSIX определяет, является ли освобождение блокировок атомарным или нет, поэтому вы должны предположить, что он ведет себя настолько неудобно, насколько это возможно для вас.Если вам нужно, чтобы они были атомарными, это не так;если вам нужно, чтобы они обрабатывались отдельно, они атомарны;если вам все равно, некоторые машины сделают это одним способом, а другие - другим.Итак, напишите свой код, чтобы он не имел значения.

Я не уверен, как вы будете писать код для обнаружения проблемы.

На практике я ожидаю, что блокировкиБыть выпущенным атомарно, но стандарт не говорит, поэтому вы не должны предполагать.

...