/proc/pid/maps를 읽으려면 read()를 사용하십시오.

/proc/pid/maps를 읽으려면 read()를 사용하십시오.

/proc/pid/maps시작 주소, 끝 주소 및 권한과 같은 정보를 추출하고 싶습니다 .

open그러나 학습 목적으로 다음 read과 같은 낮은 수준의 시스템 호출을 사용하고 싶습니다 lseek.

필요한 정보를 찾는 방법이 혼란스럽습니다. 나는 몇 가지 과제가 있음을 발견했습니다.

  1. 을 사용하여 전체 파일을 읽는 방법은 무엇입니까 read()?

지금은 ,을 사용하여 while((n = read(fd, buf, BUFSIZ)) > 0)파일을 읽고 있지만 일괄적으로 읽는 중이므로 BUFSIZ*2를 늘려도 문제가 해결되지 않습니다.

  1. -시작 주소를 찾기 위해 구분 기호를 찾을 때까지 문자를 하나씩 읽은 다음 lseek줄의 첫 번째 문자를 읽고 이를 사용하여 read시작 주소를 얻으려고 합니다. 첫 번째 반복에서는 잘 작동했지만 while((n = read(fd, buf, BUFSIZ)) > 0).

정보를 추출하는 가장 좋은 방법은 무엇입니까?

답변1

  • 예, 여기에서 바이트를 read(fd, buf, BUFSIZ)읽습니다 (마지막 블록에 도달하지 않은 경우, 남은 바이트를 모두 읽습니다. 그 수는 반환되고 ≤ 가 됩니다 ). 한 번에 모든 데이터를 읽으려면 다음을 수행하십시오.BUFSIZfdnBUFSIZ
    화장실/프로세스/PID/지도
    얼마나 긴지 확인하십시오(따라서 얼마나 크게 만드는지 BUFSIZ). 그러나 이것은 역효과를 낳을 것입니다. 전체 파일을 메모리로 읽는 것은 거의 필요하지 않거나 유용하지 않으며 다른 입력 파일에서 실행할 때마다 프로그램의 매개변수를 변경할 수 없습니다. 파일을 읽는 프로그램을 작성하는 방법을 배우고 싶다면 한 번에 한 덩어리씩 처리하는 방법을 배우는 것이 가장 좋습니다.
  • 질문의 두 번째 부분은 그다지 의미가 없습니다.  grep? C 프로그램이나 쉘 스크립트(또는 둘 다)를 작성하고 있습니까?
  • 원하는 데이터를 읽고, 버리고, 다시 돌아가서 다시 읽는 것은 매우 나쁜 습관입니다. 시작 주소 읽기-, 그런 다음 lseek거꾸로 읽고 다시 읽으십시오.특히전체 파일을 메모리로 읽는 것에 대해 이야기하는 경우. 이미 메모리에 전체 파일이 있는데 왜 일부를 다시 읽어야 할까요?
  • 나는 그것을 사용하는 것이 좋습니다 fgets. 그러나 정말로 사용하고 싶다면 read계속해서 사용하십시오. 줄 바꿈( \n) 문자를 찾아 해당 줄을 식별한 다음( fgets이 작업이 자동으로 수행됨) 해당 줄에서 필요한 정보를 추출해야 합니다.
  • 물론 원한다면 라인을 문자별로 분석할 수도 있습니다. 그러나 나는 그것을 추천한다 sscanf. 반환값을 꼭 확인하세요.

답변2

/proc/pid/maps라인 기반 파일이기 때문에 read()파일을 읽는 것이 다소 번거롭습니다. getline()이 목적으로 or 를 사용하는 것이 좋습니다 .fscanf()

관련 정보