ファイルが使用中かどうかを確認するより速い方法はありますか?

ファイルが使用中かどうかを確認するより速い方法はありますか?

ファイルが何かによって開かれているか、使用されているかを知らせてくれるコマンドライン関数または C 関数を探しています。

lsofそして、fuserこれを伝えていますが、他の多くの情報も提供されており、状況によっては最大 300 ミリ秒かかることがあります (たとえば、このコードを MAC OS X で使用する場合、私は Linux と OS X 用に開発しています) (5 ミリ秒かかる Windows ソリューションがあるので、Unix でも非常に高速で、ファイルが使用中の場合は true または false を返すものを探しています)

答え1

これをロックとして使用している場合、どちらとしても機能せずlsoffuser競合状態を防ぐこともできません。

基本的なプロセスは、開いているファイル記述子を探すためにlsofすべてのプロセスを調べることです/proc/*/fs。何をするにしても、これには時間がかかります。

これを自分で行うこともできますが、システム上で開いているすべてのプロセスをチェックする必要があるため、速度が上がる可能性は低くなります。

時間が重要な場合は、別の方法を考えましょう。

  • 自分で作成したプログラムを通じてファイルを制御する場合は、ロック ファイルを使用します。
  • ファイルを操作するコマンドを実行している場合は、そのコマンド/プログラムが提供するドキュメントを調べて、ロックファイルを作成できないかどうかを確認してください。それができない場合は、PID を含むファイルを作成できないかどうかを確認してください。次に、/proc/<PID>/fsファイルが現在開いているかどうかを確認できます。開いているファイル記述子を 1 つのプロセスだけ調べる方が、すべてのプロセスにマッピングするよりもはるかに高速です。
  • そうでなければ、あなたを助けるために、あなたが何をしているのかについてさらに詳しい情報が必要になります。

コメントで、Firefoxが特定のシステムで実行されているかどうかを確認したいという詳しい情報を提供しました。これを行う最良の方法は、Firefoxのロックファイルを探すことです。これらは以下に保存されています。デフォルトの場所Mozilla wiki で指定されています。

たとえば、Linux では、プログラムに次の操作を実行させます。

  • ディレクトリを開きます~/.mozilla/firefox/
  • すべてのディレクトリを一覧表示し、 で終わるディレクトリをフィルタリングします.default。(すべてのプロファイルは で終わると思います.defaultが、そうでない場合はすべてのディレクトリをクロールします。)
  • 上記の各ディレクトリで、 または という名前のファイルが存在するかlockどうかを確認します.parentlock。 1 つまたは両方のファイルが表示されている場合は、Firefox が開いています。

このアルゴリズムは、現在 Windows で実行しているものよりも高速に実行されるはずです。

答え2

要約

あなたのコメントの一つ、あなたは次のように述べています:

私の正確な状況は次のとおりです。ファイルへのパスがあります。Firefox が実行中の場合はロックされます。Firefox が実行中かどうかを判断するために、ロックされているかどうかを確認したいのです。

ロックファイルに関する当初の質問は、Firefox が特定のユーザーに対して実行されているかどうかを調べ、そのプロセス状態を検査するより簡単な方法があるため、遠回りのように思えます。

プロセスの状態を調べる

特定のプロセスのPIDを見つけるより賢明な方法は、グレップからプロップスパッケージ。例:

$ pgrep -u $LOGNAME firefox
5671

次にPIDの状態を調べるには、追伸:

$ ps 5671
  PID TTY      STAT   TIME COMMAND
 5671 ?        Sl   105:47 /usr/lib/firefox/firefox

または、他の不要なものなしで州旗だけを取得します。

$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl

私のシステムでは、上記のワンライナーは、常に 1.4 ミリ秒で完了します。結果はシステムによって異なる場合があります。

プロセス状態コード

ps(1) の PROCESS STATE CODES セクションには、さまざまな状態フラグの意味が詳しく記載されています。Ubuntu 14.04 のマニュアルページには次のように書かれています:

PROCESS STATE CODES
       Here are the different values that the s, stat and state output
       specifiers (header "STAT" or "S") will display to describe the state of
       a process:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by
                    its parent

       For BSD formats and when the stat keyword is used, additional
       characters may be displayed:

               <    high-priority (not nice to other users)
               N    low-priority (nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                    do)
               +    is in the foreground process group

関連情報