3

次のように機能するコマンドラインプログラムを開発したいと思います。

myprogram /c [some_executable_here]

ユーザーが指定したコマンドを起動し、読み取りI / Oのプロセス(およびサブプロセス)を「監視」し、そのプログラムが終了すると、「読み取られた」ファイルのリストを出力します(最終的に read()システムコール)。

私の最初の実装 OS は Windows ですが、Linux でも同様のことを行いたいと考えています。

私がこれまで見てきたすべての FileSystem ウォッチのような API は、プロセスではなく、ディレクトリ (または個々のファイル) を監視することを目的としているため、これを行う最善の方法が何であるかはわかりません。

編集: Windows と Linux でこれを行うために、最終的にこれを実装する方法 (または少なくとも従うことができる API へのポインター) のコード例を探しています。

また、明確にするために、OpendFilesView、procmon、または実行の最初と最後から ID (およびサブプロセス) によってプロセスを明確に識別できないシステムレベルのツールからの grep 文字列などのメソッドを使用することはできません。 ; 「foo.exe」を検索して間違ったものを取得することにより、タイミングの問題が発生したり、誤検知が発生したりする可能性はありません。

4

3 に答える 3

7

Linux では、私は間違いなく使いたいと思いますstrace。シンプルで強力です。例えば:

$ strace -o/tmp/blah -f -eopen,read bash -c "cat ciao.txt"

要求されたコマンド-f( /tmp/blah.

必要に応じて、正常に読み取られたファイルのセットだけを抽出するために、後で少し処理する必要があります。たとえば、Python を使用すると、次のことができます。

import re

linere = re.compile(r'^(\d+)\s+(\w+)\(([^)]+)\)\s+\=\s*(.*)$')

def main():
  openfiles = dict()
  filesread = set()
  with open('/tmp/blah') as f:
    for line in f:
      mo = linere.match(line)
      if mo is None:
        print "Unmatched line %r" % line
      pid, command, args, results = mo.groups()
      if command == 'open':
        fn = args.split(',', 1)[0].strip('"')
        fd = results.split(' ', 1)[0]
        openfiles[fd] = fn
      elif command == 'read':
        if results != '0':
          fd = args.split(',', 1)[0]
          filesread.add(openfiles[fd])
      else:
        print "Unknown command %r" % command
  print sorted(filesread)

これは少し単純化しすぎています (&c などの他のシステムコールを確認する必要がありますdup) が、必要な作業の要点を示していることを願っています。私の例では、これは以下を発行します:

['/lib/libc.so.6', '/lib/libdl.so.2', '/lib/libncurses.so.5',
 '/proc/meminfo', '/proc/sys/kernel/ngroups_max',
 '/usr/share/locale/locale.alias', 'ciao.txt']

そのため、「データファイル」だけでなく、動的ライブラリ&cを取得するために行われたものも「読み取り」としてカウントされます...システムコールレベルでは、ほとんど違いはありません。それが必要な場合は、データ以外のファイルを除外できると思います。

私はstraceそのような目的に非常に便利であるため、Windowsで同じ仕事をするように命じられた場合、最初の試みはStraceNTに行くことです.100 %の互換性はありません.私のPythonコード(コマンドの準備と実行、straceおよび結果の後処理)でこれらの違いを説明できます。

残念ながら、私の知る限り、他の Unix システムの中には、root (スーパーユーザー) の場合にのみこの種の機能を提供するものがsudoありdtraceますdtruss。を Mac に簡単に移植straceする方法も、root 権限なしでそのようなタスクを実行する他の方法も知りません。

于 2009-09-27T18:47:06.343 に答える
5

「プロセスモニター」(procmon.exe)を試してください。フィルター(監視するプロセスの名前)を指定できます。次に、すべてのファイルとそのファイルに対する操作が一覧表示されます。

Linuxでは、lsof現在のスナップショットとstrace継続的な監視を試してください。で出力をフィルタリングする必要がありますgrep

これらのツールはすべて、プロセス構造(つまり、OSがプロセスを管理するために使用するデータ構造)をチェックし、そこに記載されているハンドル/ファイル記述子を列挙します。これはファイルシステムAPIの機能ではなく、プロセス管理APIの機能です。

[編集] Windowsで独自のツールの作成を開始するには、このページの「どのように機能するか」のセクションを参照してください。

于 2009-09-17T15:41:44.850 に答える