Lê / proc / pid / maps usando read ()

1

Eu 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, desejo usar a chamada de sistema de baixo nível, como: open , read e lseek .

Estou confuso sobre como usar as informações de que preciso. Existem alguns desafios que encontrei:

  1. Como ler o arquivo inteiro usando read() ?

Neste momento, estou usando while((n = read(fd, buf, BUFSIZ)) > 0) , para ler o arquivo, mas aparentemente ele lê em vários lotes, aumentando o BUFSIZ * 2, não resolve o problema.

  1. Estou tentando definir o endereço inicial, leia o caractere um por um até encontrar o - separador e, em seguida, lseek para o primeiro caractere na linha e use read para obter o início endereço. Funciona bem na primeira iteração, mas atrapalha a segunda iteração de while((n = read(fd, buf, BUFSIZ)) > 0) .

Qual é a melhor maneira de extrair as informações?

    
por Bagus Trihatmaja 26.12.2017 / 03:23

2 respostas

1
  • Sim, read(fd, buf, BUFSIZ) lerá BUFSIZ bytes de fd (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 em n e será ≤ BUFSIZ ). Se você quiser ler todos os dados de uma só vez, você pode fazer
    wc /proc/pid/maps
    para ver quanto tempo é (e, portanto, quão grande é fazer BUFSIZ ). 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 usar fgets , vá em frente e faça. Você precisará procurar por caracteres de nova linha ( read ) e assim identificar as linhas ( \n faria 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.
por 26.12.2017 / 04:59
0

Como /proc/pid/maps é um arquivo baseado em linha, usar read() para ler o arquivo é um pouco trabalhoso. Eu sugeriria usar getline() ou fscanf() para essa finalidade.

    
por 26.12.2017 / 04:45