Programação C

Função de leitura POSIX na programação C

Função de leitura POSIX na programação C
Em sistemas operacionais compatíveis com POSIX tradicionais, para obter informações de um documento contido em um sistema de arquivos, um programa usava a chamada de sistema read. Um descritor de documento que geralmente é acessado de uma chamada anterior para abrir é definido pelo arquivo. Esta chamada de sistema de leitura lê as informações em bytes e o inteiro que o chamador especifica a partir do documento e, em seguida, salva em um buffer fornecido pelo mecanismo de chamada.

Definição de Função

Antes de definir a função de leitura em seu código, você deve incluir alguns pacotes necessários.

#incluir

Aqui está como você define a função de leitura POSIX:

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);
>> ssize_t read (int fd, void * buf, size_t nbytes);

Três argumentos de parâmetro podem ser obtidos da chamada do método de leitura:

int fd: O descritor do arquivo de onde as informações devem ser lidas. Podemos usar um descritor de arquivo adquirido por meio de uma chamada de sistema aberto ou podemos apenas usar 0, 1 ou 2 referindo-se à entrada típica, saída regular ou erro regular, respectivamente.

Vazio * buf: O buffer ou matriz de caracteres em que os dados lidos devem ser salvos e mantidos.

Size_t nbyte: O número de bytes que precisam ser lidos do documento antes de truncar. Todas as informações podem ser armazenadas no buffer se as informações a serem lidas forem menores que nbytes.

Descrição

O método read () tenta ler bytes 'nbyte' no cache de buffer referido por 'buf' do arquivo conectado com o descritor de documento aberto 'Fildes' ou 'fd'. Não define a natureza de várias leituras simultâneas no mesmo fluxo, FIFO ou unidade terminal.

Em documentos que permitem a leitura, o processo de leitura começa no deslocamento do documento, e o deslocamento é aumentado pelo número de bytes lidos. Se o deslocamento do documento estiver na borda do arquivo ou além dela, não há bytes lidos e read () não produz nenhum.

Quando a contagem é 0, read () reconhecerá os erros mencionados abaixo. Se não houver erros ou se read () não for contabilizado com Erros, um read () resulta em zero com uma contagem de 0 e, portanto, não tem outras repercussões.

Se a contagem for maior que SSIZE_MAX, conforme POSIX.1, então o resultado é determinado pela implementação.

Valor de retorno

O número de bytes 'lido' e 'pread' revertido após a realização deve ser um número inteiro não negativo enquanto zero aponta para o final do arquivo. A posição do documento é progredida por este número, ou então, para indicar um erro, os métodos retornam -1 e atribuem 'errno'. Quando este valor é menor que o número de bytes solicitados, não é um erro de byte. É possível que menos bytes estejam disponíveis por enquanto.

Erros

As funções pread e read não terão êxito se ocorrerem estes erros:

EAGAIN:

O documento ou descritor de arquivo 'fd' pertence a um arquivo não-socket que foi rotulado como não-bloqueador (O NONBLOCK) e irá bloquear a leitura.

EWOULDBLOCK:

O descritor 'fd' pertence a um socket que foi rotulado como não bloqueador (O_NONBLOCK) e irá bloquear a leitura.

EBADF:

O 'fd' pode não ser um descritor utilizável ou pode não estar aberto para leitura.

EFAULT:

Isso acontece quando o seu 'buf' está fora do seu espaço de endereço acessível.

EINTR:

Antes da leitura dos dados de informação, a chamada pode ter sido interrompida por um sinal.

EINVAL:

Este erro ocorre quando o seu descritor 'fd' está envolvido em um objeto, que não é apropriado para leitura, ou o documento foi desamarrado com o sinalizador O_DIRECT e um ou outro endereço indicado em 'buf', o valor indicado em 'count ', ou o deslocamento do documento não está devidamente associado.

EINVAL:

O descritor 'fd' pode ter sido formado usando uma chamada para timerfd_create (2), e o buffer de tamanho incorreto foi fornecido para leitura.

EIO:

É um erro de entrada / saída. Ocorre quando o grupo de processos em segundo plano tenta ler a partir de seu terminal regulatório e um ou outro está ignorando ou bloqueando SIGTTIN, ou seu grupo de processos está perdido. Outra razão para este erro pode ser um erro de entrada / saída de baixo nível durante a leitura de um disco rígido ou fita. Outra causa potencial de EIO em arquivos de dados em rede é a remoção do bloqueio de aviso no descritor de arquivo e a falha desse bloqueio.

EISDIR:

O descritor de arquivo 'fd' pertence a um diretório.

Notas:

Muitos outros erros também podem ocorrer, dependendo do objeto vinculado ao descritor 'fd'. Os formulários size_t e ssize_t são tipos de dados numéricos não marcados e marcados definidos por POSIX.1. No Linux, no máximo 0x7ffff000 (2.147.479.552) bytes podem ser transmitidos pela função de leitura (e chamadas de sistema equivalentes), retornando o número de bytes originalmente transmitidos (em plataformas de 32 bits e 64 bits). Com os sistemas de arquivos NFS, apenas no primeiro momento em que o carimbo de data / hora é alterado pela leitura de pequenos fluxos de informações, as chamadas subsequentes não o fariam. Ele é acionado pelo cache de atributos do lado do cliente, pois, embora não todos, os clientes NFS param de atualizar para o servidor via st_atime (hora do último acesso ao arquivo) e as leituras do lado do cliente realizadas no buffer do cliente não acionariam mudanças para atime no servidor, pois nenhuma leitura do lado do servidor está disponível. Ao remover o cache de atributos do lado do cliente, os metadados do UNIX podem ser acessados, mas isso aumentaria significativamente a carga no servidor e afetaria a produtividade na maioria dos casos.

Exemplo 01:

Aqui está um programa C para demonstrar a chamada de função de leitura no sistema Linux. Escreva o comando abaixo como está em um novo arquivo. Adicione bibliotecas e, na função principal, inicialize um descritor e dimensione. O descritor está abrindo o arquivo e o tamanho é usado para ler os dados do arquivo.

A saída para o código acima seria como mostrado na imagem abaixo.

Exemplo 02:

Outro exemplo para ilustrar o funcionamento da função de leitura é dado abaixo.

Crie outro arquivo e anote o código abaixo como está nele. Aqui estão dois descritores, fd1 e fd2, que ambos têm seu próprio acesso ao arquivo de tabela aberta. Então, para foobar.txt, cada descritor tem sua localização de arquivo. O primeiro byte de foobar.txt é traduzido de fd2, e o resultado é c = f, não c = o.

Conclusão

Lemos a função de leitura POSIX na programação C de forma eficiente. Felizmente, não restam dúvidas.

Como alterar os botões esquerdo e direito do mouse no PC com Windows 10
É normal que todos os dispositivos de mouse de computador sejam ergonomicamente projetados para usuários destros. Mas existem dispositivos de mouse di...
Emular cliques do mouse passando o mouse usando o mouse sem cliques no Windows 10
Usar um mouse ou teclado na postura errada de uso excessivo pode resultar em muitos problemas de saúde, incluindo tensão, síndrome do túnel do carpo e...
Adicione gestos do mouse ao Windows 10 usando essas ferramentas gratuitas
Nos últimos anos, os computadores e sistemas operacionais evoluíram muito. Houve um tempo em que os usuários tinham que usar comandos para navegar pel...