Quero extrair as informações de /proc/pid/maps
, como: o endereço inicial, o endereço final e a permissão.
No entanto, para fins de aprendizado, quero usar a chamada de sistema de baixo nível, como: open
, read
e lseek
.
Estou confuso sobre como obter as informações de que preciso. Existem alguns desafios que encontrei:
- Como ler o arquivo inteiro usando
read()
?
No momento, estou usando while((n = read(fd, buf, BUFSIZ)) > 0)
, para ler o arquivo, mas aparentemente ele lê em lote múltiplo, aumentando o BUFSIZ
*2, não resolve o problema.
- Estou tentando grep o endereço inicial, lendo o caractere um por um até encontrar o
-
separador e, em seguida,lseek
para o primeiro caractere da linha e usoread
para obter o endereço inicial. Funciona bem na primeira iteração, mas atrapalha na segunda iteração dowhile((n = read(fd, buf, BUFSIZ)) > 0)
.
Qual é a melhor maneira de extrair as informações?
read(fd, buf, BUFSIZ)
irá ler osBUFSIZ
bytes defd
(a menos que tenha chegado ao último bloco, caso em que irá ler todos os bytes restantes, cujo número será devolvido emn
e será ≤BUFSIZ
). Se você quiser ler todos os dados de uma só vez, você pode fazer para ver quanto tempo é (e, portanto, quão grande para fazerBUFSIZ
). Mas isso seria contraproducente. A leitura de um arquivo inteiro na memória raramente é necessária ou mesmo útil, e você não pode alterar os parâmetros em seus programas toda vez que os executa em um arquivo de entrada diferente. Se você quiser aprender a escrever programas que leem arquivos, será muito melhor aprender a lidar com eles um bloco de cada vez.grep
? Você está escrevendo um programa C ou um script shell (ou ambos)?-
, e depoislseek
voltar e lê-lo novamente - especialmente se você estiver falando sobre ler o arquivo inteiro na memória. Se você tem o arquivo inteiro na memória, por que diabos você iria querer ler parte dele novamente?fgets
. Mas, se você realmente prefere usarread
, vá em frente e faça. Você precisará procurar\n
caracteres de nova linha ( ) e assim identificar as linhas (fgets
faria isso por você) e, em seguida, extrair as informações desejadas das linhas.sscanf
. Certifique-se de verificar o valor de retorno.Como
/proc/pid/maps
é um arquivo baseado em linha, usarread()
para ler o arquivo é meio complicado. Eu sugeriria usargetline()
oufscanf()
para essa finalidade.