Какая другая символическая ссылка с жесткой ссылкой после unlik?

1.

#include <stdio.h> #include <unistd.h> void main(){ link("foo", "bar"); unlink("foo"); if(open("bar", 1) < 0) printf("open error\n"); else printf("open succeeded\n"); } 

2.

 #include <stdio.h> #include <unistd.h> void main(){ symlink("foo", "bar"); unlink("foo"); if(open("bar", 1) < 0) printf("open error\n"); else printf("open succeeded\n"); } 

результат от первого кода «открыт успешно».
и файл «foo» удаляется. остается только «bar», содержимое которого совпадает с файлом «foo».

reslut frome второй код – «открытая ошибка». а также остается «баром».

почему эти результаты сгенерированы?
1. особенно, хотя каждая жесткая ссылка и символическая ссылка («бар») указывают на файл «foo», файл «foo» был удален.
2. Почему «bar» не удаляется, после unlink («foo»). Функция unlink означает, что она удаляет ссылку, которая указывает указанный файл (этот случай, «foo»)
3. Почему результат от первого кода и второго кода отличается?

Я сделаю краткую ссылку из существующей статьи,

С файлами жестких ссылок ,

При удалении файлов часть данных не удаляется, пока все части имени файла не будут удалены. В индексе указано количество, указывающее, сколько имен файлов указывает на этот файл, и этот счет уменьшается на 1 каждый раз, когда один из этих файлов удаляется. Когда счетчик делает его равным нулю, индексный дескриптор и связанные с ним данные удаляются.

Пожалуйста, прочитайте разницу между жесткими и мягкими ссылками .

Например, вы можете быть заинтересованы в этом другом factoid на hardlinks,

подсчет также отражает, сколько раз файл был открыт без закрытия (другими словами, сколько ссылок на файл по-прежнему активно). Это имеет некоторые последствия, которые не очевидны вначале: вы можете удалить файл, чтобы никакая часть «filename» не указывала на индексный дескриптор, не освобождая место для части данных файла, поскольку файл все еще открыт.

Вы можете попробовать это с помощью тестового кода.

Кстати: можете ли вы проверить свои два случая?
Я думаю, вы получите ошибку для случая symlink () и успеха для случая link ().
Я предлагаю вам запустить их в разных каталогах или использовать разные имена файлов для двух случаев 🙂

Во-первых, уверены ли вы, что вы получили результаты программ по правильному пути? Я получаю отказ для версии symlink и успех для версии жесткой ссылки.

Во-вторых, передача числовых констант в качестве аргумента flags для open не переносима и делает ваш код трудным для чтения. Соответствующие флаги определены в <fcntl.h> , а константа, которую вы используете, – O_WRONLY .

Если вы передаете символическую ссылку в качестве первого аргумента для open , она эквивалентна передаче имени, на которое указывает символьная ссылка. В вашем примере символическая ссылка указывает на несуществующий файл, что приводит к сбою системного вызова. Если вам нужен вызов для создания файла, вам необходимо передать O_WRONLY|O_CREAT качестве флагов. Это приведет к foo файла foo .

В случае жесткой привязки bar имени ссылается на содержимое файла foo а не на имя. Unlinking foo не изменяет этот факт, поэтому bar продолжает существовать и может быть открыт без O_CREAT .