ブラックボックスの実行ファイルで自動的に実行できる最も簡単で信頼性の高い方法は、のCPU使用率です。ロードが完了したら、すべてのスレッドが(ほとんど)アイドル状態になるはずです。多分、無限のタイムアウトでイベントを待つ場合には、時折目を覚ますことがあります。 (そして、マウスの動きのようなその他のGUIイベントから)。
ブロックされたディスクI/Oとブロックされたユーザー入力の待機の違いを検出するのに十分な時間待ってください。 (top
のプロセスリストのようなものでD
対S
で示すように、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に持つと確信しています。テスト中のソフトウェアがファイルを再度ループする場合には、おそらく数ミリ秒待ってから再度チェックしてください。
大規模なpdfファイルの場合、表示が部分的なファイルの読み取りのみを使用していて、ユーザーがスクロールしたときに残りのデータをストリーミングすると思っていたため、アプリケーションが終了するまでファイルで終了しませんでした。 – Ped7g