Ferramentas do usuário

Ferramentas do site


unlink

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.


unlink [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1
Linha 1: Linha 1:
 +====== Função unlink ======
 +
 +Sintaxe:
 +
 +''[[tipos_dados|int]] unlink(const [[tipos_dados|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:
 +
 +<code c>
 +#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;
 +}
 +</code>
 +
 + --- //[[marcos@laureano.eti.br|Marcos Laureano]] 2008/04/25 07:11//