"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > GET NEXT LINE Um projeto para aprender como lidar com descritores de arquivos e E/S do sistema

GET NEXT LINE Um projeto para aprender como lidar com descritores de arquivos e E/S do sistema

Publicado em 2024-11-07
Navegar:628

No domínio da programação C, gerenciar entrada, saída e memória de maneira eficaz é fundamental. Para ajudá-lo a compreender esses conceitos críticos, get_next_line é um projeto onde você escreverá uma função que lê um arquivo linha por linha usando um descritor de arquivo. Cada invocação da função lê a próxima linha do arquivo, permitindo processar todo o conteúdo do arquivo, uma linha por vez.

Noções básicas sobre descritores de arquivos e E/S em um sistema

O que é um descritor de arquivo?

Um descritor de arquivo é um número inteiro não negativo que identifica exclusivamente um arquivo aberto em um sistema. Quando um programa abre um arquivo, o sistema operacional retorna um descritor de arquivo que pode ser usado para fazer referência a esse arquivo em operações subsequentes, como leitura, gravação ou fechamento do arquivo. Descritores de arquivos são uma abstração usada pelo sistema operacional para gerenciar vários recursos de E/S, incluindo arquivos, soquetes e pipes.

0, 1 e 2 (entrada padrão, saída padrão e erro padrão) no Processo A são independentes e separados dos descritores de arquivo no Processo B. Esse isolamento garante que as operações de arquivo em um processo não interfiram com aquelas em outro.

tabela de descritores de arquivo

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

Cada descritor de arquivo está associado a uma entrada na tabela do descritor de arquivo que contém informações essenciais sobre o arquivo. Isso inclui o caminho do arquivo, as permissões de acesso e o deslocamento atual, que rastreia a posição dentro do arquivo para operações de leitura/gravação. Essa estrutura permite que o sistema operacional gerencie vários arquivos abertos de forma eficiente e garanta o acesso correto e a manipulação dos dados.

Observe que os descritores de arquivo 0, 1 e 2 são reservados pelo sistema operacional para fluxos padrão. O descritor de arquivo 0 é usado para entrada padrão (stdin), que normalmente representa a entrada do teclado. O descritor de arquivo 1 é usado para saída padrão (stdout), que representa a saída para a tela ou terminal. O descritor de arquivo 2 é usado para erro padrão (stderr), que também representa a saída para a tela ou terminal, mas é especificamente destinado a mensagens de erro. Esses descritores de arquivos reservados garantem que as operações básicas de entrada e saída possam ser gerenciadas de forma consistente em diferentes programas e ambientes. Qualquer descritor de arquivo retornado pela função open será 3 ou superior, garantindo que não entre em conflito com esses fluxos padrão.

como abrir arquivo

exemplo

'#include '
'#include '

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}




detalhamento do código

Um descritor de arquivo, representado como um número inteiro, é obtido usando a função open, que recebe dois parâmetros: o nome (ou caminho) do arquivo e sinalizadores que determinam as permissões de acesso do arquivo. Por exemplo, para ler o conteúdo de um arquivo, usamos o sinalizador O_RDONLY (somente leitura). Para ler e escrever, usamos o sinalizador O_RDWR. Embora existam muitos sinalizadores disponíveis, usaremos apenas O_RDONLY para este projeto. A função open retorna um número inteiro não negativo, que é o descritor do arquivo se a operação for bem-sucedida; caso contrário, retornará -1 para indicar um erro (você não tem permissão para acessar exemplo.txt). Observe que a função open está na biblioteca unistd.h e os sinalizadores de permissão são definidos em fcntl.h.

lendo de um descritor de arquivo

exemplo

'#include '
'#include '
'#include '
'#define BUFFER_SIZE 4'

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);




discriminação

resultado do código

1ª chamada: HEL
2ª chamada: LO
3ª chamada: WOR
4ª chamada: LD
5ª chamada: (nulo)

A função read, fornecida pela biblioteca unistd.h, é usada para ler dados de um descritor de arquivo. São necessários três parâmetros: o descritor do arquivo, um buffer para armazenar os dados lidos e o número de bytes para ler do arquivo. A função de leitura retorna o número de bytes lidos do arquivo.

Na tabela de descritores de arquivos, existe um atributo chamado offset. O deslocamento acompanha a posição atual no arquivo. Cada vez que a função read é chamada, ela lê os dados começando no deslocamento atual e então avança o deslocamento pelo número de bytes lidos. Isso garante que as leituras subsequentes continuem de onde a última leitura parou.

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

No nosso exemplo:

  • A primeira chamada para read lê os primeiros 3 bytes do arquivo e os armazena no buffer, começando no início do arquivo (offset 0). O deslocamento é então atualizado para 3.
  • A segunda chamada para read lê os próximos 3 bytes começando no deslocamento atualizado (3) e, em seguida, atualiza o deslocamento para 6.
    etc...

  • A 5ª chamada para o buffer de leitura será nula e a leitura retornará 0 indicando o fim do arquivo.

Este processo continua até que todos os dados do arquivo tenham sido lidos ou até que ocorra um erro. O buffer é terminado em nulo após cada leitura para garantir que possa ser impresso como uma string.

O PROBLEMA

char *get_next_line(int fd) toma como parâmetro um descritor de arquivo de um arquivo e retorna uma linha para cada chamada. Se chegar ao final do arquivo, ele retornará NULL.

Parâmetros

  • fd: Descritor do arquivo a ser lido.
  • BUFFER_SIZE: O tamanho do buffer usado para ler pedaços do arquivo. seu programa não deve ter vazamentos.

Solução:

https://github.com/Its-JoeTheKing/get_next_line

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/aerrfig/get-next-line-a-42-project-to-learn-how-to-deal-with-file-descriptors-and-io-of- system- 3652 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3