Я ищу функцию командной строки или функцию c, которая сообщит мне, открыт ли файл/используем чем-то.
lsof
и fuser
действительно скажите это, но они обеспечивают много другой информации, которая приводит к взятию до 300 мс в некоторых ситуациях (как то, когда я использую этот код на Mac OS X, я - devving для Linux и OS X) (у меня есть решение для окон, которое берет 5 мс, таким образом, я пытаюсь найти что-то в Unix, который также очень быстр, и просто возвращает TRUE или FALSE, если файл используется),
Если Вы будете использовать это в качестве блокировки, то она не будет работать ни одним lsof
или fuser
предотвратите условия состязания.
Базовый процесс это lsof
делает тралить посредством всех процессов /proc/*/fs
поиск открытых дескрипторов файлов. Это собирается занять время независимо от того, что Вы делаете.
Можно сделать это сами, но это вряд ли будет немного быстрее, поскольку необходимо проверить на каждый открытый процесс в системе.
Если то, что Вы делаете, строго ограничено во времени, выясните другой способ сделать это.
/proc/<PID>/fs
видеть, открыт ли Ваш файл в настоящее время или нет. Рассмотрение только одного процесса открытые дескрипторы файлов будет намного быстрее затем отображаться через всех них.Вы дали больше информации в комментарии, что Вы хотите определить, работает ли Firefox на данной системе. Лучший способ сделать это должно искать файлы блокировки Firefox. Они хранятся в местоположениях по умолчанию, указанных на Wiki Mozilla.
Например, на Linux, имейте свою программу, делают следующее:
~/.mozilla/firefox/
каталог..default
. (Я думаю весь конец профилей с .default
, если не только проверяют в каждый каталог.)lock
или .parentlock
. Если Вы видите один или оба файла, Firefox открыт.Этот алгоритм должен выполниться быстрее, чем, что Вы в настоящее время делаете на окнах.
В один из Ваших комментариев , Вы заявляете:
Хорошо моя точная ситуация: у Меня есть путь к файлу. Это заблокировано, если Firefox работает. Я хочу видеть, работает ли его заблокированный или не сказать, если Firefox.
Ваш исходный вопрос о lockfiles походит на длинный путь, вокруг того, когда существуют более легкие способы узнать, работает ли Firefox за данным пользователем, и осмотреть его состояние процесса.
А более разумный способ найти PID данного процесса состоит в том, чтобы использовать pgrep от пакет procps . Например:
$ pgrep -u $LOGNAME firefox
5671
можно тогда осмотреть состояние PID с ps:
$ 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 миллисекунды для завершения. Ваш пробег может варьироваться.
раздел PROCESS STATE CODES PS (1) детали, что различное состояние отмечает средний. На 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