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