2016-10-21 9 views
3

私はアプリケーションで行っている計測を自動化しようとしていますが、問題は処理後に単独で終了しないアプリケーションを扱っていることです。たとえば、任意のpdfviewer/readerをとります。ファイルを開くとファイルが表示され、アプリケーションがファイルを処理したことがわかります。アプリケーションがファイルの処理を完了したことを知る方法?

アプリケーションがファイルを処理することによって、そのファイルがアプリケーションによって正常に表示されたことを意味します。

アプリケーションは、Adobe Reader、xpdf、foxitreader、またはex gpicviewなどの任意のイメージビューア用の任意のGUI pdfビューアにすることができます。ファイルフォーマットは、特定のファイルフォーマットではなく、任意のタイプでよい。

また、私はアプリケーションのソースコードを持っていない、私はアプリケーションのバイナリを扱っています。

しかし、プロセスを自動化するときに、アプリケーションがファイルをいつ処理したかを知りたいと思います。最初に考えることができるのは、実行後にファイルの処理が完了し、特定の基本ブロックが実行されたときに計測を終了するという基本ブロックがいくつか存在することです。

しかし、ここでの問題は、その基本ブロックを特定する方法です。

+1

大規模なpdfファイルの場合、表示が部分的なファイルの読み取りのみを使用していて、ユーザーがスクロールしたときに残りのデータをストリーミングすると思っていたため、アプリケーションが終了するまでファイルで終了しませんでした。 – Ped7g

答えて

1

ブラックボックスの実行ファイルで自動的に実行できる最も簡単で信頼性の高い方法は、のCPU使用率です。ロードが完了したら、すべてのスレッドが(ほとんど)アイドル状態になるはずです。多分、無限のタイムアウトでイベントを待つ場合には、時折目を覚ますことがあります。 (そして、マウスの動きのようなその他のGUIイベントから)。

ブロックされたディスクI/Oとブロックされたユーザー入力の待機の違いを検出するのに十分な時間待ってください。 (topのプロセスリストのようなものでDSで示すように、UnixライクなOSで、これは、ディスク・睡眠と睡眠の間の差である。)

あなたはOSに依存したくない場合ディスクのスリープと通常のスリープを検出するには、ディスクの最大I/O要求サービス時間(〜数回のディスク待ち時間、テスト中のプロセスがI/Oを実行する唯一のプロセスである場合は、 。その期間にブラックボックスプロセスがCPU時間を使用していない場合は、読み込みが完了し、ファイルを画面に表示しているとみなすことができます。

もちろん、@ Ped7gが指摘しているように、ファイル全体を解析していない可能性があります。たとえば、ユーザーが大きな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を自分で使用できます。


また、Linuxではファイルの位置を/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 

これは、ファイルの読み込みが完了したときに、evinceがファイル位置をEOFに持つと確信しています。テスト中のソフトウェアがファイルを再度ループする場合には、おそらく数ミリ秒待ってから再度チェックしてください。

+0

クローズまたはEOFは、アプリケーションが処理を終了したことを示します。バッファ内のファイルを読み込んだ後、そのバッファを使用しているデータを表示したとします。ファイルiを処理することによって、ファイルが完全に読み取られたことを意味するものではありません。私はそれが正常に表示されていることを意味します。 – user2823667

+0

@ user2823667:それは良い点です。おそらくその組み合わせとCPU時間の使用を止めるのを待っているのが最善の策です。ファイルが読み込まれるまで待ってから、ディスクのI/O待ち時間に応じて、約40msかそれ以上の時間のCPU時間を使用していません。 (I/Oを待っている間、偽陽性を避ける)。 –

+0

@ user2823667:スレッドのどれかがタイムスライス全体を使い果たしたかどうかを追跡できる場合、GUIイベントを処理するために目を覚ましてすぐにスリープ状態に戻ったかどうかを調べることができます。 –

関連する問題