Ключевым отличием между поведением файловой системы Windows и поведением файловой системы linux является блокировка и подсчет ссылок.
В Windows, если у процесса открыт файл, тогда этот файл и путь, ведущий к этому файлу, защищены.
Итак, если у кого-то открыт файл «C: \ a \ b \ c \ d \ file.txt», то никому не разрешается переименовывать или удалять любую часть пути «C: \ a \ b \ c \ d». \ file.txt».
Модель linux сильно отличается, любая часть этого пути может быть изменена, и даже файл может быть удален. Процесс, удерживающий дескриптор в file.txt, все еще имеет ссылку, и файл не будет удален из файловой системы, пока все дескрипторы не будут закрыты.
Win32 API не предоставляет прямой способ хранения дескриптора каталога (хотя для этого есть API - смотрите функции "Zw", FindFirstFile, может быть, я не уверен, API резервного копирования и т. Д.) - но ваш процесс "текущий каталог" содержит дескриптор этого каталога.
Таким образом, вы можете получить поведение "openat", изменив свой рабочий каталог и затем открыв файл напрямую. Лучше было бы использовать что-то вроде ZwCreateFile (), чтобы открыть дескриптор каталога - поскольку «текущий каталог» является глобальным процессом.
Поиск Stackoverflow и Microsoft.com для получения информации ZwCreateFile.