Função open
Sintaxe:
int open(const char * path, int oflag, /* [mode_t mode]*/);
Para se abrir um arquivo deve-se chamar a função open. A função recebe o nome do arquivo como parâmetro juntamente com o flag indicando o modo de abertura e flags informando opções adicionais de abertura e/ou tratamento de arquivo. Pode-se colocar todo o caminho do arquivo juntamente com o seu nome.
A função irá retorna um número inteiro positivo em caso de sucesso no processo de abertura. Este número é o descritor do arquivo e deve ser armazenado e passado para as demais funções a serem realizadas no arquivo.
O sistema Unix/Linux garante que o número retornado é o menor número de descritor ainda não utilizado pelo sistema. Isto pode ser utilizado dentro de um programa de maneira a abrir um outro arquivo para a Entrada Padrão, Saída Padrão ou Erro padrão. Por exemplo, ao se fechar a Entrada Padrão, descritor 1, esta se disponibilizando o número 1 como sendo o menor descritor. Ao se abrir um novo arquivo, o número será usado para este arquivo. Como as funções do sistema sempre gravam as suas informações na Saída Padrão, estarão gravando no arquivo e não mais na tela.
A função no processo de abertura irá verificar se o arquivo existe, se o usuário tem permissão sobre o diretório onde o arquivo se encontra e também se tem permissão para realizar a operação indicada no parâmetro (leitura/gravação).
Caso ocorra algum erro na abertura a função irá retornar o valor -1 como resultado. Na variável errno estará indicado o erro ocorrido na abertura.
O segundo parâmetro da função open irá indicar qual é o modo de abertura sendo realizado no arquivo. Deve-se obrigatoriamente indicar um e somente um dos seguintes flags :
- O_RDONLY - O arquivo está sendo aberto para leitura. Caso não se coloque nenhum flag adicional e caso o arquivo não exista a função de abertura retornará um erro.
- O_WRONLY - O arquivo está sendo aberto para gravação. Caso o arquivo não exista e não se coloque nenhum flag adicional, a função retornará um erro.
- O_RDWR - O arquivo estará sendo aberto para leitura e gravação. Também neste caso, se o arquivo não existir e nenhum flag adicional foi colocado a função retorna erro.
Pode-se colocar alguns flags adicionais com um dos flags acima definidos. Estes flags irão determinar as ações a serem realizadas no processo de abertura do arquivo e devem ser colocadas com or binário no segundo parâmetro.
Os flags possíveis são:
- O_APPEND - Cada gravação a ser realizada no arquivo será feita no final do mesmo.
- O_CREAT - Caso o arquivo não exista ele será criado no diretório. Esta opção exige que se coloque no terceiro parâmetro o modo de proteção a ser usado na criação do arquivo.
- O_EXCL - Este flag deve ser usado em conjunto com o flag O_CREAT. Ele indica para a função open retornar um erro caso o arquivo já exista.
- O_TRUNC - Se o arquivo existir no diretório, o conteúdo do mesmo será eliminado, deixando o arquivo com o tamanho de zero bytes.
- O_SYNC - Indica para o Unix que cada gravação espere que a gravação física dos dados seja efetuada. Isto garante que as informações gravadas pelo processo sejam efetivamente gravadas em disco, evitando perda de informações caso o processo seja cancelado. Em contrapartida o desempenho do processo será seriamente prejudicado.
O terceiro parâmetro deve ser fornecido caso na abertura se tenha especificado o flag O_CREAT. Este terceiro parâmetro indica a máscara de proteção a ser usada na criação do arquivo. Pode-se especificar mais de um flag neste campo, bastando fazer-se or binário entre os seguintes valores:
- S_IRUSR - Leitura para usuário
- S_IWUSR - Gravação para usuário
- S_IXUSR - Execução para usuário
- S_IRRGRP - Leitura para grupo
- S_IWGRP - Gravação para grupo
- S_IXGRP - Execução para grupo
- S_IROTH - Leitura para outros
- S_IWOTH - Gravação para outros
- S_IXOTH - Execução para outros
Pode-se também indicar a proteção a ser usada no arquivo usando-se o modo numérico octal de permissão aceito pelo sistema Unix (veja no help do sistema o comando chmod). As permissões de um arquivo sofrem a influência da configuração atual do sistema, veja no help do sistema o funcionamento do comando umask.
Veja o exemplo:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <fcntl.h> #include <string.h> int main (int argc, char *argv[]) { int iFileDescriptor; /* Descritor do arquivo a ser aberto */ printf("Tentando abrir o arquivo 'arquivo_teste_1' para leitura\n"); iFileDescriptor = open ("arquivo_teste_1", O_RDONLY); /* Abrindo um arquivo em modo leitura. Se este arquivo não existir no diretório local, ocasionara em erro na abertura.. */ if (iFileDescriptor < 0) { fprintf (stderr, "Erro : %s\n", strerror(errno)); } else { printf ("Arquivo 1 aberto\n"); } close (iFileDescriptor); printf("Tentando abrir o arquivo 'arquivo_teste_2' para gravação\n"); iFileDescriptor = open("arquivo_teste_2", O_WRONLY); /* Abrindo um arquivo em modo gravação. Se este arquivo não existir no diretório local, ocorrerá em erro na abertura... */ if (iFileDescriptor < 0) { fprintf(stderr, "Erro : %s\n", strerror(errno)); } else { printf("Arquivo 2 aberto\n"); } close(iFileDescriptor); printf("Tentando abrir o arquivo 'arquivo_teste_3' para leitura\n"); iFileDescriptor = open("arquivo_teste_3", O_RDONLY | O_CREAT, 0744); /* Abrindo um arquivo para leitura que não existe. Como foi utilizado a flag O_CREAT, se o arquivo não existir ele será criado com a permissão 0744 (leitura, gravação e execução para usuário e leitura para grupo e outros). */ if (iFileDescriptor < 0) { fprintf(stderr, "Erro : %s\n", strerror(errno)); } else { printf("Arquivo 3 aberto\n"); } close (iFileDescriptor); printf("Tentando abrir o arquivo 'arquivo_teste_4' para gravacao\n"); iFileDescriptor = open("arquivo_teste_4", O_WRONLY | O_TRUNC);/* Abrindo um arquivo para gravação. Este arquivo não existe no diretório local, ocasionando em erro na abertura. Se o arquivo existisse, como foi especificado a flag O_TRUNC, o arquivo seria truncado (zerado). */ if (iFileDescriptor < 0) { fprintf (stderr, "Erro : %s\n", strerror(errno)); } else { printf ("Arquivo 4 aberto\n"); } close (iFileDescriptor); printf("Tentando abrir o arquivo 'arquivo_teste_5' para gravacao\n"); iFileDescriptor = open ("arquivo_teste_5", O_WRONLY | O_CREAT | O_EXCL, 0755); /* Abrindo um arquivo para gravação com os flags O_CREAT e O_EXCL, ou seja, o arquivo somente será criado se já não existir no sistema de arquivos. */ if (iFileDescriptor < 0) { fprintf (stderr, "Erro : %s\n", strerror(errno)); } else { printf ("Arquivo 5 aberto\n"); } close (iFileDescriptor); return 0; }
— Marcos Laureano 2008/04/25 07:01