Função unlink

Sintaxe:

int unlink(const char * path);


A remoção de um arquivo de um sistema de arquivo é feita através da função unlink. Este nome é devido a que a função simplesmente recebe um nome de arquivo como parâmetro e decrementa o número de links existente no inode do mesmo (consulte o manual do sistema e veja o comando ln). Caso o número de links atinja o valor zero, então os dados do arquivo serão liberados para o sistema como áreas livres para uso.

Isto permite que se faça a remoção de arquivos ainda abertos, sem que haja a perda de dados enquanto o arquivo estiver aberto. Esta técnica permite a criação de arquivo temporários através da abertura dos mesmos. Logo em seguida remove-se o arquivo com a função unlink que irá decrementar o atributo correspondente.

Os dados criados pelo processo continuam a valer até que o processo feche o arquivo. Nesta ocasião seriam alterados os atributos do inode com as informações pertinentes, mas como o número de links está zerado os dados são eliminados do sistema. Com isto estamos prevendo que caso o processo cancele por algum motivo, o arquivo temporário criado pelo mesmo será removido automaticamente pelo sistema.

Veja o exemplo:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
 
int main (int argc, char  *argv[])
{
   int  iFileDescriptor;
   char *szArquivo;
   char szBuffer[25];
 
   /* Função que retorna um nome aleatório baseado nos parâmetros informados. O nome retornado é único no sistema. */
   szArquivo = tempnam ("/tmp", "temp");
 
   printf ("Abrindo o arquivo %s'\n", szArquivo);
   iFileDescriptor = open (szArquivo, O_RDWR | O_CREAT | O_TRUNC, 0777); /* cria o arquivo temporário */
   if (iFileDescriptor < 0)
   {
      perror (argv[0]);
      exit (1);
   }
 
   printf ("Removendo o arquivo ABERTO\n"); /* remove o arquivo, detalhe, ele está aberto */
   if (unlink (szArquivo) < 0)
   {
      perror (argv[0]);
      exit (1);
   }
 
   printf ("Gravando informacoes no arquivo\n"); /* gravandos dados no arquivo já excluído...*/
   strcpy (szBuffer, "123456789-123456789-");
   if (write (iFileDescriptor, szBuffer, 20) < 20)
   {
      perror (argv[0]);
      exit (1);
   }
 
   printf ("Posicionando no inicio do arquivo e lendo as informacoes\n");
   strcpy (szBuffer, "++++++++++++++++++++");
 
   lseek (iFileDescriptor, 0, SEEK_SET); /* indo para o início do arquivo */
 
   if (read (iFileDescriptor, szBuffer, 20) < 20) /* lendo dados do arquivo (que tinha sido excluído)...*/
   {
      perror (argv[0]);
      exit (1);
   }
 
   printf ("Informacoes gravadas e lidas : |%s|\n", szBuffer);
   close (iFileDescriptor);
   return 0;
}

Marcos Laureano 2008/04/25 07:11