... по-видимому невозможна в Linux.Требования: транзакционность. Два разрешённых состояния:
* есть оригинальный файл, нет замены нигде
* есть замена в нужном месте, оригинального файла нетДва запрещённых:
* есть оригинальный файл, замена насрана где-то
* нет ни оригинала, ни заменыОбычный файл вы можете создать с флагом O_TMPFILE (временный файл, не пишущийся в журнал), а потом попробовать атомарно заменить через renameat2(..., RENAME_EXCHANGE), но файлы в /proc/self/fd - это симлинки, и renameat2 в них не умеет. Можно, конечно, попробовать поиграться с readlink, но он вам выдаст несуществующий путь.
Hardlink - не умеет заменять файлы, флаг AT_REPLACE так и не был добавлен.
Директория/симлинк: вы не можете ни создать их с заменой, ни создать их файлы через open с флагом O_TMPFILE, и потом тип поменять. Сами же вызовы для их создания флаги не поддерживают.
Складывается впечатление, что так сделано намеренно, чтобы с race conditions дел не иметь.
Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному имени на другой. Для любых разумных применений этого хватает. Проблемы только у гениев, которым хочется в ту же самую айноду резко положить другое содержимое. Где у вас есть такие возможности, там и процветайте, собственно.
> Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному
> имени на другой. Для любых разумных применений этого хватает. Проблемы только
> у гениев, которым хочется в ту же самую айноду резко положить
> другое содержимое. Где у вас есть такие возможности, там и процветайте,
> собственно.Вася хочет, не файл заменить атомарно(для чего нужные сисколы есть), а заменить для работающего процесса открытый файл. Ну, я так понял, но этот поток бреда сложно однозначно понять
>> Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному
>> имени на другой. Для любых разумных применений этого хватает. Проблемы только
>> у гениев, которым хочется в ту же самую айноду резко положить
>> другое содержимое. Где у вас есть такие возможности, там и процветайте,
>> собственно.
> Вася хочет, не файл заменить атомарно(для чего нужные сисколы есть), а заменить
> для работающего процесса открытый файл. Ну, я так понял, но этот
> поток бреда сложно однозначно понятьтолько не рассказывайте ему про sighup
> только не рассказывайте ему про sighupно тебе-то можно рассказать, что sighup без соответствующего обработчика не работает?
> без соответствующего обработчикапроблема разработчика
Конечно невозможно. Такое только в однозадачных системах бывает.
"Замена насрана" может быть в памяти другого процесса.
Это временно.
Угу. Всё время, пока оба процесса меряются временем обновления.
"Обычный файл вы можете создать с флагом O_TMPFILE (временный файл, не пишущийся в журнал), а потом попробовать атомарно заменить через renameat2"Это уже нарушение второй группы условий (одновременно насрана замена и есть оригинал).
Вердикт - кривые входные условия, транзакционности нескольких операций в ФС действительно нет.