Частичный ответ есть в разделе 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 .