0

(touch コマンドを使用して) ユーザー空間にファイルを作成します。1 つの OPEN 操作と 1 つの CLOSE ファイル操作のみが表示されると予想していますが、カーネル通知から 2 つの OPEN 操作と 3 つの CLOSE 操作を取得します。操作シーケンスは次のようになります: 開く --> 閉じる --> 開く --> 閉じる ---> 閉じる.... 誰かこれについてヒントを教えてくれませんか? 前もって感謝します。

4

3 に答える 3

2

Kauth vnode および fileop リスナーは、私にとってはうまく機能しています。意味をなさないイベント通知を受け取っている場合は、カーネル デバッガーを使用して kauth リスナー コールバックにブレークポイントを配置し、バックトレースを確認することをお勧めします。xnu ソース コードが利用可能であるため、問題の通知を受け取った理由とバックトレースから解決できるはずです。

ファイルへのハンドルが複数ある場合、追加のクローズ通知を受け取ることができることを私は知っています。したがって、ファイル、dup()ファイル記述子を開き、両方のハンドルを閉じると、1 つ開いて 2 つ閉じることになります。それがまさにその方法です、私は恐れています。プロセスが特定のファイルの残りのハンドルを持っているかどうかを判断するための公開カーネル API はありません。

2つのオープン通知を受け取っている理由については、touch書かれている方法に関係があるか、シェルに関係している可能性があります。通常、オープン通知は実際にはシステムコールに対応していopen()ます。確信が持てない場合は、open と close を 1 回だけ呼び出す独自の「タッチ」ツールを作成して、正しいイベントを取得しているかどうかをテストしてください。必要に応じて、Apple の touch コマンドのソースも入手できます。

于 2013-09-05T12:22:30.540 に答える
1

より詳細な VNode スコープで何が起こっているかを見ると、タッチを使用すると非常に多くのことが発生することがわかります。これは、「testtouch」というファイルを作成したときの、Singh の「Mac OSX Internals」の VNode モニターに基づくプログラムからの出力です。

09:00:51.262 Pid: 49 (fseventsd) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTESREAD_SECURITY} 09:00:51.263 Pid: 49 (fseventsd) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTESREAD_SECURITY} 09: 00:51.278 Pid: 40 (mds) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.278 Pid: 40 (mds) "/Users/user/testtouch" VREG VT_HFS { WRITE_DATAACCESS } 09:00: 51.278 Pid: 40 (mds) "/Users/user/testtouch" VREG VT_HFS {READ_DATAACCESS} 09:00:51.279 Pid: 40 (mds) "/Users/user/testtouch" VREG VT_HFS {EXECUTEACCESS} 09:00:51.279 Pid : 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_DATA} 09:00:51.279 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.280 Pid:559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {WRITE_DATAACCESS } 09:00:51.280 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_DATAACCESS} 09:00:51.280 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {EXECUTEACCESS} 09:00:51.281 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.286 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_EXTATTRIBUTES} 09: 00:51.286 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTESREAD_SECURITY} 09:00:51.287 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTES} 09:00: 51.287 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.288 Pid: 559 (mdworker) "/Users/user/testtouch"VREG VT_HFS { WRITE_DATAACCESS} 09:00:51.288 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {READ_DATAACCESS} 09:00:51.288 Pid: 559 (mdworker) "/Users/user/testtouch" VREG VT_HFS {EXECUTEACCESS} 09 :00:51.289 Pid: 40 (mds) "/Users/user/testtouch" VREG VT_HFS {READ_ATTRIBUTES}

興味深いことに、WRITE_DATAACCESS が 3 回発生していることがわかります。これは 2 つのフラグであることに注意してください。WRITEDATA と ACCESS。

このデータから、3 つの開封が表示されているものと相関しているように見えますが、どこかで開封を見逃したか、何らかの理由でそのうちの 1 つを通知できなかった可能性があります。

于 2013-09-09T08:11:38.097 に答える
0

MacOS X には、ファイルを開くことができる多くの機能も含まれています。Spotlight によるインデックス作成を検討してください。ファイルを変更する (つまり、開いてから閉じる) たびに、Spotlight は最終的にそのファイルのインデックスを作成します。これは、複数の開閉イベントが表示される理由を説明できます。

これは、イベントを引き起こしたプロセスの PID を示す proc_selfpid() で分析することで確認できます。(これは、 と の両方で、プロセスに属するスレッドから KAuth コールバックが直接呼び出されるため機能KAUTH_SCOPE_FILEOPしますKAUTH_SCOPE_VNODE。)

また、open イベント数と close イベント数の違いは、プロセスのフォークが原因である可能性があります。このケースを考えてみましょう:

  1. プロセスはファイルを開きます。
  2. フォークを処理します。つまり、子は開かれたファイルのファイル記述子を継承します。
  3. 親プロセスと子プロセスの両方が最終的に記述子を閉じます (close()プロセスの終了時に明示的に、または暗黙的に)
于 2013-10-16T13:32:17.127 に答える