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