C/CPP에서 ptrace()를 사용하여 다른 프로세스의 메모리 읽기 [RaspberryPi]

C/CPP에서 ptrace()를 사용하여 다른 프로세스의 메모리 읽기 [RaspberryPi]

따라서 처음에 프로세스 A는 스트림(UART)에서 읽은 데이터(37바이트)가 포함된 파일을 생성합니다.

프로세스 B는 /dev/shm에 저장된 이 데이터를 얻어야 합니다.

프로세스 A가 파일에 쓸 수 있는 절대 최대 시간은 4밀리초입니다. 이 값을 초과하면 허용할 수 없는 데이터 손실이 발생합니다. 파일 생성에는 평균 600us가 소요됩니다. 이는 완전히 괜찮으며 무작위로 7ms 이상으로 급증하지 않습니다.

파일 처리를 피하기 위해 배열의 주소를 시작 매개변수로 전달하여 RAM에 직접 액세스하고 싶습니다.

// Process A
sprintf(cmd, "path_to_file.out %i", (unsigned int)&rx_buffer);
system(cmd);

// Process B
int rx_buffer_address = atoi(argv[1]);

사용Gilles가 제안한 절차, 한 번 읽을 수 있었어요

sprintf(mem_file_name, "/proc/%d/mem", pid);
mem_fd = open(mem_file_name, O_RDONLY);
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
lseek(mem_fd, offset, SEEK_SET);
read(mem_fd, buf, _SC_PAGE_SIZE);
ptrace(PTRACE_DETACH, pid, NULL, NULL);

함수에 close(mem_fd)를 추가하더라도 이 메서드를 실행하려는 두 번째 시도는 반복적으로 실패합니다. open()은 ENOENT(해당 파일이나 디렉터리 없음)를 반환하고 ptrace는 ESRCH(해당 프로세스 없음)를 반환합니다.

추가 조사에 따르면 첫 번째 PTRACE_DETACH 호출이 ESRCH를 반환한 것으로 나타났습니다.

ptrace() 찾기, PTRACE_PEEKDATA를 사용하여 메모리를 읽으려고 하면 모든 읽기가 0xFF를 반환합니다.

PEEKDATA 메서드로 액세스하는 지역 맵이 /mem 파일 설명자와 다릅니까? 아니면 이 두 가지 방법이나 파일 액세스 시간에 대해 뭔가가 빠졌나요?

관련 정보