Definição de Função
Antes de definir a função de leitura em seu código, você deve incluir alguns pacotes necessários.
#incluirAqui 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.