В самой директории хранится информация о названии файла и ссылка на другую ячейку памяти с основной информацией (inode)
Hardlink — ссылка на одну inode
Symlink — хранится просто путь на другой файл
Справедливо не для всех, например FAT хранит все в самой директории (поэтому он не поддерживает hardlinkи)
Файловые дескрипторы (FD) ссылаются на inode. Следовательно если меняются данные — изменения видны. Если файл удалить/переименовать - FD об этом даже не узнает
Появляется хак - если файл создается долго, можно просто создать inode, записать файл, а потом просто привязать ее к какой-то директории
В винде используются file lockes, в линухе есть что-то похожее, но не используется. Блокировать файл, чтобы не было работы с данными, которые уже некорректны. Но тогда вываливаются ошибки и что лучше - хз.
Можно подписываться на изменения файлов, но нужно понимать, что подписываетесь вы на inode. Поэтому не стоит путать изменения файла(данных) или изменения в каталоге.
Системный вызов stat позволяет вернуть что-то похожее на inode. По нему можно посчитать ref-count и как-то разобраться с hardlinks