블랙 박스 실행 파일에 대해 자동으로 수행 할 수있는 가장 쉽고 안정적인 작업은 입니다. 해당 CPU 사용량은입니다. 로드가 끝나면 모든 스레드가 (대부분) 유휴 상태 여야하며 무제한 시간 초과 이벤트가 발생할 때까지 기다리는 경우가 있습니다. (그리고 마우스 움직임과 같은 기타 GUI 이벤트에서).
디스크 입/출력에서 차단 된 사용자 차단과 사용자 입력 대기 차단의 차이를 감지 할만큼 충분히 오래 기다려야합니다. (top
의 프로세스 목록과 같은 물건에 D
대 S
같이 유닉스 계열 운영체제에서이 디스크 수면과 수면의 차이는있다.)
당신이 OS에 의존하지 않으려면 디스크 수면과 일반 수면을 감지하기 위해 최대 디스크 I/O 요청 서비스 시간보다 몇 배 더 오래 기다려야합니다 (~ 수회 디스크 대기 시간, 테스트중인 프로세스가 I/O를 수행하는 유일한 프로세스 인 경우 더 낮음) . 블랙 박스 프로세스가 그 간격에서 어떤 CPU 시간도 사용하지 않았다면,로드가 완료되었다고 가정하고 화면에 파일을 표시 할 수 있습니다.
물론 @Padd7g가 지적했듯이 전체 파일을 구문 분석하지 않았을 수 있습니다. 사용자가 예를 들어 큰 PDF를 스크롤 할 때 필요에 따라 느리게로드 될 수 있습니다. CPU 시간을 관찰하는 것은 페이지 다운 명령을 프로그래밍 방식으로 전송 한 후 프로세스가 업데이트를 완료했을 때이를 감지하는 합리적인 방법이어야합니다.
나는 이것으로 좋은 결과를 얻을 수 있어야한다고 생각합니다. 시스템 I/O 성능이나 뛰어난 디스크 -IO 요청과 같은 여러 입력을 고려한 발견 적 방법이 필요할 수도 있습니다. 가능한 한 최악의 경우까지 대기하지 않고 프로세스가로드를 완료했다는 것을 확실하게 결정할 수 있습니다. 파일 기술자에 EOF에 도달하는 과정을 찾고
주석에서 설명하고있는 바와 같이
, 이 목적 (그것을 mmap의 수도)에 대한 신뢰할 수 없습니다. 흥미롭거나 유용 할 경우를 대비하여 여기에 남겨 두겠습니다. 그러나 사용을 위해이 모든 것을 무시하고 싶을 수도 있습니다. 기껏해야 프로세스를로드하는 시점을 결정할 때 휴리스틱에 대한 입력으로 사용할 수 있습니다.
대부분의 OS에는 프로세스가 다른 프로세스를 추적 할 수있는 기능이 있습니다.Linux에서 주요한 것은 ptrace API입니다. strace
과 같은 명령을 사용하면 시스템 호출을 추적 할 수 있습니다. 나는 Windows가 비슷한 것을 가지고 있다고 생각한다. OS X도 마찬가지라고 생각한다.
PDF에서 open() 시스템 호출을 찾아 올바른 fd를 찾은 다음 mmap, read() 및 close() 시스템 호출을 찾습니다. read()가 0을 반환하면 EOF가됩니다. mmap없이 닫히면, 프로세스가 다시 열리거나 (어떤 이유로 든 dup() 또는 dup2()를 사용하지 않는 한) 프로세스가 완료됩니다.
strace의 텍스트 출력을 구문 분석하거나 ptrace API를 직접 사용할 수 있습니다.
또는 리눅스에서는 파일 위치를 /proc/<PID>/fdinfo/<FD>
으로 볼 수 있습니다. 다른 OS는 아마도 열린 파일 디스크립터/파일 핸들의 파일 위치를 볼 수있는 유사한 기능을 가지고 있습니다.
예를 들어 evince
을 열어 PDF를 열어 놓았습니다. `/ proc 디렉토리에/
$ ll /proc/4241/fd
...
lr-x------ 1 peter peter 64 Oct 21 06:43 14 -> /f/p/docs/agner_fog.microarchitecture.pdf # is anyone really surprised this is the PDF I had open? :P
...
$ ls -lL /proc/4241/fd/14 # follow the symlink to see the file size
-rw-rw-r-- 1 peter peter 2078709 Feb 4 2016 /proc/4241/fd/14
$ m /proc/4241/fdinfo/14 # alias for less
pos: 2078709
flags: 0100000
mnt_id: 49
이는이 파일을 읽는 끝나면 내 생각이 명시하다이 EOF에서 파일 위치를해야합니다 확인합니다. 테스트중인 소프트웨어가 파일을 다시 루프하는 경우에는 수 밀리 초를 기다렸다가 다시 확인해야합니다.
큰 PDF 파일의 경우 사용자가 아래로 스크롤 할 때 나머지 데이터를 스트리밍하는 부분 파일 읽기 만 사용하는 것으로 생각했습니다 ... 앱이 닫힐 때까지 파일로 끝나지 않았습니다. – Ped7g