====== 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: #include #include #include #include #include #include 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.eti.br|Marcos Laureano]] 2008/04/25 07:11//