Чем отличается символическая ссылка с жесткой ссылкой после отмены ссылки?

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».

результат с второго кода - «ошибка открытия». а также остается только «бар».

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

3
задан 7 June 2011 в 21:07

2 ответа

Я кратко расскажу о существующей статье ,

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

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

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

Например, вас может заинтересовать этот другой фактоид на жестких ссылках,

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

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

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

0
ответ дан 7 June 2011 в 21:07

Прежде всего, вы уверены, что получили правильную информацию о программах? Я получаю ошибку для версии символической ссылки и успех для версии с жесткой ссылкой.

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

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

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

0
ответ дан 7 June 2011 в 21:07

Другие вопросы по тегам:

Похожие вопросы: