open
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
— | open [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Função open ====== | ||
+ | |||
+ | Sintaxe: | ||
+ | |||
+ | '' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | 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/ | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main (int argc, char *argv[]) | ||
+ | { | ||
+ | int iFileDescriptor; | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | if (iFileDescriptor < 0) | ||
+ | { | ||
+ | fprintf (stderr, "Erro : %s\n", strerror(errno)); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf (" | ||
+ | } | ||
+ | |||
+ | close (iFileDescriptor); | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | if (iFileDescriptor < 0) | ||
+ | { | ||
+ | fprintf(stderr, | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | 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, | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | close (iFileDescriptor); | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | flag O_TRUNC, o arquivo seria truncado (zerado). */ | ||
+ | |||
+ | if (iFileDescriptor < 0) | ||
+ | { | ||
+ | fprintf (stderr, "Erro : %s\n", strerror(errno)); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf (" | ||
+ | } | ||
+ | |||
+ | close (iFileDescriptor); | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | 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 (" | ||
+ | } | ||
+ | |||
+ | close (iFileDescriptor); | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | --- // | ||
open.txt · Última modificação: 2023/09/12 16:14 por 127.0.0.1