Gibt es eine schnellere Möglichkeit zu überprüfen, ob eine Datei verwendet wird?

Gibt es eine schnellere Möglichkeit zu überprüfen, ob eine Datei verwendet wird?

Ich suche nach einer Befehlszeilenfunktion oder C-Funktion, die mir mitteilt, ob eine Datei geöffnet ist bzw. von etwas verwendet wird.

lsofund fusersagen das, aber sie stellen eine Menge anderer Informationen bereit, was in manchen Situationen bis zu 300 ms dauern kann (beispielsweise wenn ich diesen Code unter MAC OS X verwende, ich entwickle für Linux und OS X) (ich habe eine Windows-Lösung, die 5 ms braucht, also versuche ich, etwas unter Unix zu finden, das auch sehr schnell ist und einfach „true“ oder „false“ zurückgibt, wenn die Datei verwendet wird).

Antwort1

Wenn Sie dies als Sperre verwenden, funktioniert es weder als solches, lsofnoch fuserverhindert es Race Conditions.

Der grundlegende Prozess lsofbesteht darin, alle Prozesse nach offenen Dateideskriptoren zu durchsuchen /proc/*/fs. Dies wird einige Zeit in Anspruch nehmen, egal, was Sie tun.

Sie können dies selbst tun, es wird aber wahrscheinlich nicht schneller gehen, da Sie jeden offenen Prozess im System überprüfen müssen.

Wenn Ihre Aufgabe zeitkritisch ist, überlegen Sie sich eine andere Möglichkeit.

  • Wenn Sie die Datei über ein von Ihnen geschriebenes Programm steuern, verwenden Sie eine Sperrdatei.
  • Wenn Sie einen Befehl ausführen, der auf die Datei einwirkt, sehen Sie nach, welche Dokumentation dieser Befehl/das Programm bietet, und prüfen Sie, ob er/es keine Sperrdatei erstellen kann. Andernfalls prüfen Sie, ob er/es keine Datei mit seiner PID darin erstellen kann. Dann können Sie nachsehen, /proc/<PID>/fsob Ihre Datei derzeit geöffnet ist oder nicht. Wenn Sie nur die offenen Dateideskriptoren eines Prozesses betrachten, ist dies viel schneller, als wenn Sie alle Dateideskriptoren zuordnen.
  • Andernfalls benötige ich, um Ihnen helfen zu können, weitere Informationen über Ihre Tätigkeit.

Sie haben in einem Kommentar weitere Informationen gegeben, dass Sie feststellen möchten, ob Firefox auf einem bestimmten System ausgeführt wird. Der beste Weg, dies zu tun, besteht darin, nach den Sperrdateien von Firefox zu suchen. Diese sind gespeichert inStandardspeicherorteim Mozilla-Wiki angegeben.

Lassen Sie Ihr Programm unter Linux beispielsweise Folgendes tun:

  • Öffnen Sie das ~/.mozilla/firefox/Verzeichnis.
  • Listet alle Verzeichnisse auf und filtert nach Verzeichnissen, die auf enden .default. (Ich glaube, alle Profile enden mit .default, wenn nicht, durchforsten Sie einfach alle Verzeichnisse.)
  • Suchen Sie in jedem der oben aufgeführten Verzeichnisse nach einer Datei mit dem Namen lockoder .parentlock. Wenn Sie eine oder beide Dateien sehen, ist Firefox geöffnet.

Dieser Algorithmus sollte schneller ausgeführt werden als das, was Sie derzeit unter Windows tun.

Antwort2

Kurz zusammengefasst

Ineiner deiner Kommentaregeben Sie an:

Nun, meine genaue Situation ist: Ich habe den Pfad zu einer Datei. Sie ist gesperrt, wenn Firefox läuft. Ich möchte sehen, ob sie gesperrt ist oder nicht, um festzustellen, ob Firefox läuft.

Ihre ursprüngliche Frage zu Sperrdateien scheint ein Umweg zu sein, obwohl es einfachere Möglichkeiten gibt, herauszufinden, ob Firefox für einen bestimmten Benutzer ausgeführt wird, und seinen Prozessstatus zu überprüfen.

Prozessstatus prüfen

Eine sinnvollere Möglichkeit, die PID eines bestimmten Prozesses zu ermitteln, ist die Verwendung vonpgrepvon demprocpsPaket. Beispiel:

$ pgrep -u $LOGNAME firefox
5671

Sie können dann den Zustand des PID überprüfen mitps:

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

oder holen Sie sich einfach die Staatsflaggen ohne anderen Ballast:

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

Auf meinem System dauert es für den obigen Einzeiler konstant nur 1,4 Millisekunden, bis er fertig ist. Bei Ihnen kann das anders sein.

Prozessstatuscodes

Der Abschnitt PROCESS STATE CODES von ps(1) beschreibt detailliert, was die verschiedenen Statusflags bedeuten. Unter Ubuntu 14.04 heißt es auf der Manpage:

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

verwandte Informationen