Je recherche une fonction de ligne de commande ou une fonction c qui me permette de savoir si un fichier est ouvert/utilisé par quelque chose.
lsof
et fuser
le disent, mais ils fournissent beaucoup d’autres informations qui peuvent prendre 300 ms dans certaines situations (comme lorsque j’utilise ce code sur MAC OS X, je travaille sous Linux et OS X) une solution Windows qui prend 5 ms alors j'essaie de trouver quelque chose dans Unix qui est également très rapide et qui renvoie simplement true ou false si le fichier est en cours d'utilisation)
Si vous utilisez ceci comme verrou, cela ne fonctionnera pas car ni lsof
ni fuser
n'empêcheront les conditions de concurrence.
Le processus de base que lsof
effectue consiste à parcourir tous les processus /proc/*/fs
à la recherche de descripteurs de fichiers ouverts. Cela va prendre du temps, peu importe ce que vous faites.
Vous pouvez le faire vous-même, mais ce ne sera probablement pas plus rapide, car vous devez vérifier chaque processus ouvert sur le système.
Si votre temps est critique, trouvez une autre façon de le faire.
/proc/<PID>/fs
pour voir si votre fichier est actuellement ouvert ou non. Si vous ne regardez qu'un processus, les descripteurs de fichier ouverts seront beaucoup plus rapides que la correspondance entre eux.Dans un commentaire, vous avez indiqué que vous souhaitez déterminer si Firefox est exécuté sur un système donné. La meilleure façon de faire est de rechercher les fichiers de verrouillage de Firefox. Ceux-ci sont stockés dans emplacements par défaut spécifiés sur le wiki de Mozilla.
Par exemple, sous Linux, demandez à votre programme de procéder comme suit:
~/.mozilla/firefox/
..default
. (Je pense que tous les profils se terminent par .default
, sinon simplement dans chaque répertoire.)lock
ou .parentlock
. Si vous voyez un ou les deux fichiers, Firefox est ouvert.Cet algorithme devrait s'exécuter plus rapidement que ce que vous faites actuellement sur Windows.
Dans n de vos commentaires , vous déclarez:
Ma situation exacte est la suivante: j'ai le chemin d'accès à un fichier. Il est verrouillé si Firefox est en cours d'exécution. Je veux voir si son verrouillé ou ne pas dire si Firefox est en cours d'exécution.
Votre question initiale sur lockfiles semble être un long chemin à parcourir lorsqu'il existe des moyens plus simples de savoir si Firefox est en cours d'exécution pour un utilisateur donné et d'inspecter l'état de son processus.
Un moyen plus judicieux de trouver le PID d’un processus donné consiste à utiliser pgrep à partir du procps package. Par exemple:
$ pgrep -u $LOGNAME firefox
5671
Vous pouvez ensuite inspecter l'état du PID avec ps :
$ ps 5671
PID TTY STAT TIME COMMAND
5671 ? Sl 105:47 /usr/lib/firefox/firefox
ou juste obtenir les drapeaux d'état sans autre crue:
$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl
Un de mes systèmes, le one-liner ci-dessus ne prend systématiquement que 1,4 millisecondes. Votre kilométrage peut varier.
La section PROCESS STATE CODES de ps (1) détaille la signification des différents indicateurs d'état. Sur Ubuntu 14.04, la page de manuel dit:
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