2016-10-21 9 views
3

나는 응용 프로그램에서 내가하고있는 계측을 자동화하려고하지만 문제는 처리 후 자체적으로 종료되지 않는 응용 프로그램을 다루는 것입니다. 예를 들어 pdfviewer/reader를 가져 오십시오. 파일을 열면 파일이 표시되고 응용 프로그램이 파일을 처리 한 것을 볼 수 있습니다.응용 프로그램이 파일 처리를 완료했음을 알 수있는 방법은 무엇입니까?

응용 프로그램에서 파일을 처리하면 해당 파일이 응용 프로그램에서 성공적으로 표시되었습니다.

어도비 리더, xpdf, foxitreader 또는 ex gpicview 용 이미지 뷰어 등 모든 GUI PDF 뷰어가 될 수 있습니다. 파일 형식은 특정 파일 형식이 아닌 모든 형식 일 수 있습니다.

또한 응용 프로그램의 소스 코드가 없으므로 응용 프로그램의 이진 파일을 처리하고 있습니다.

그러나 프로세스를 자동화하는 동안 응용 프로그램이 파일을 처리 한시기를 알고 싶습니다. 내가 처음 생각할 수있는 것은 그것이 실행 된 후 특정 기본 블록이 실행될 때 파일을 처리하고 내 계측을 종료했다는 것을 말하는 기본 블록이있을 것이라고 생각할 수 있습니다.

하지만 문제는 기본 블록을 식별하는 방법입니다.

+1

큰 PDF 파일의 경우 사용자가 아래로 스크롤 할 때 나머지 데이터를 스트리밍하는 부분 파일 읽기 만 사용하는 것으로 생각했습니다 ... 앱이 닫힐 때까지 파일로 끝나지 않았습니다. – Ped7g

답변

1

블랙 박스 실행 파일에 대해 자동으로 수행 할 수있는 가장 쉽고 안정적인 작업은 입니다. 해당 CPU 사용량은입니다. 로드가 끝나면 모든 스레드가 (대부분) 유휴 상태 여야하며 무제한 시간 초과 이벤트가 발생할 때까지 기다리는 경우가 있습니다. (그리고 마우스 움직임과 같은 기타 GUI 이벤트에서).

디스크 입/출력에서 ​​차단 된 사용자 차단과 사용자 입력 대기 차단의 차이를 감지 할만큼 충분히 오래 기다려야합니다. (top의 프로세스 목록과 같은 물건에 DS 같이 유닉스 계열 운영체제에서이 디스크 수면과 수면의 차이는있다.)

당신이 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에서 파일 위치를해야합니다 확인합니다. 테스트중인 소프트웨어가 파일을 다시 루프하는 경우에는 수 밀리 초를 기다렸다가 다시 확인해야합니다.

+0

닫기 또는 EOF 응용 프로그램 처리가 완료되었음을 나타낼 필요가 있습니까? 버퍼에서 파일을 읽은 다음 해당 버퍼를 사용중인 데이터를 표시한다고 가정합니다. 파일 처리로 파일이 완전히 읽혔다는 의미는 아닙니다. 내 말은 그것이 성공적으로 표시되었다는 것입니다. – user2823667

+0

@ user2823667 : 예, 좋은 지적입니다. 아마도 그 조합과 CPU 시간 사용을 중단하기를 기다리는 것이 최선의 방법입니다. 파일을 읽을 때까지 기다렸다가 디스크 I/O 대기 시간에 따라 ~ 40ms 정도의 상당한 CPU 시간을 사용하지 마십시오. (I/O를 기다리는 중에 오 탐지 (false positives)를 피하십시오. –

+0

@ user2823667 : 스레드가 전체 타임 슬라이스를 다 사용했는지 여부를 추적 할 수있는 경우, GUI 이벤트를 처리하기 위해 잠에서 깨어 났는지, 즉시 잠자기 상태로 되돌아 갔는지 여부를 추적 할 수 있다면, 그렇게 생각할 것입니다. . –