- Sim,
read(fd, buf, BUFSIZ)leráBUFSIZbytes defd(a menos que você tenha alcançado o último bloco, Nesse caso, ele lerá todos os bytes restantes, o número do qual será retornado emne será ≤BUFSIZ). Se você quiser ler todos os dados de uma só vez, você pode fazerwc /proc/pid/maps
para ver quanto tempo é (e, portanto, quão grande é fazerBUFSIZ). Mas isso seria contraproducente. Ler um arquivo inteiro na memória raramente é necessário ou até mesmo útil, e você não pode mudar os parâmetros em seus programas toda vez que você executá-los em um arquivo de entrada diferente. Se você quiser aprender a escrever programas que leiam arquivos, você ficará muito melhor aprendendo como lidar com eles um bloco de cada vez. - A segunda parte da sua pergunta não faz muito sentido. %código%? Você está escrevendo um Cprogram ou um shell script (ou ambos)?
- E lendo os dados que você quer, jogando fora,
e voltar e ler de novo é um péssimo hábito de entrar.
É ridículo ler o endereço inicial até o
grep, e depois-para trás e leia novamente - especialmente se você está falando lendo o arquivo inteiro na memória. Se você tiver o arquivo inteiro na memória, por que no mundo você iria querer ler parte disso de novo? - Eu recomendaria usar
lseek. Mas, se você realmente preferir usarfgets, vá em frente e faça. Você precisará procurar por caracteres de nova linha (read) e assim identificar as linhas (\nfaria isso por você) e depois extrair a informação desejada das linhas. - Você pode certamente analisar as linhas, caractere por caractere, se quiser.
Mas eu recomendo
fgets. Certifique-se de verificar o valor de retorno.