Vou fazer uma referência rápida a partir de um artigo existente
Com arquivos de hardlink ,
Ao excluir arquivos, a parte de dados não é descartada até que todas as partes do nome do arquivo tenham sido excluídas. Há uma contagem no inode que indica quantos nomes de arquivos apontam para esse arquivo, e essa contagem é diminuída em 1 sempre que um desses nomes de arquivos é excluído. Quando a contagem chega a zero, o inode e seus dados associados são excluídos.
Por favor, leia A diferença entre hard links e soft links para detalhes.
Como, você pode estar interessado neste outro factoid em hardlinks,
a contagem também reflete quantas vezes o arquivo foi aberto sem ser fechado (em outras palavras, quantas referências ao arquivo ainda estão ativas). Isso tem algumas ramificações que não são óbvias a princípio: você pode excluir um arquivo para que nenhuma parte "filename" aponte para o inode, sem liberar o espaço para a parte de dados do arquivo, porque o arquivo ainda está aberto.
Você poderia tentar isso com seu código de teste.
btw: você pode reavaliar seus dois casos?
Eu acho que você iria obter erro para o caso symlink () e sucesso para o caso link ().
Eu sugiro que você os execute em diretórios diferentes ou use nomes de arquivos diferentes para os dois casos :-)