Estoy buscando una función de línea de comando o función c que me permita saber si un archivo está abierto / en uso por algo.
lsof
y fuser
digo esto, pero proporcionan mucha otra información que resulta en tomar hasta 300 ms en algunas situaciones (como cuando uso este código en MAC OS X, me estoy dedicando a Linux y OS X) (tengo una ventana solución que tarda 5 ms, así que estoy tratando de encontrar algo en Unix que también sea muy rápido y solo devuelva verdadero o falso si el archivo está en uso)
command-line
files
Noitidart
fuente
fuente
Respuestas:
Si está usando esto como un candado, no funcionará como ninguno
lsof
nifuser
evitará las condiciones de carrera.El proceso básico que lo
lsof
hace es rastrear todos los procesos en/proc/*/fs
busca de descriptores de archivos abiertos. Esto tomará tiempo sin importar lo que hagas.Puede hacerlo usted mismo, pero no es probable que sea más rápido, ya que debe verificar cada proceso abierto en el sistema.
Si lo que está haciendo es crucial para el tiempo, descubra otra forma de hacerlo.
/proc/<PID>/fs
para ver si su archivo está actualmente abierto o no. Mirar solo un proceso de descriptores de archivos abiertos será mucho más rápido que mapearlos en todos.Dio más información en un comentario que desea determinar si Firefox se está ejecutando en un sistema determinado. La mejor manera de hacerlo es buscar los archivos de bloqueo de Firefox. Estos se almacenan en ubicaciones predeterminadas especificadas en la wiki de Mozilla.
Por ejemplo, en Linux, haga que su programa haga lo siguiente:
~/.mozilla/firefox/
directorio..default
. (Creo que todos los perfiles terminan con.default
, si no solo rastrear en cada directorio).lock
o.parentlock
. Si ve uno o ambos archivos, Firefox está abierto.Este algoritmo debería ejecutarse más rápido que lo que hace en Windows actualmente.
fuente
ps aux firefox
. Tome esos PID y búsquelos en el/proc/
sistema de archivos.ps aux firefox
. Bueno, mi situación exacta es: tengo la ruta a un archivo. Está bloqueado si Firefox se está ejecutando. Quiero ver si está bloqueado o no para saber si Firefox se está ejecutando.TL; DR
En uno de sus comentarios , declara:
Su pregunta original sobre los archivos de bloqueo parece el camino largo cuando hay formas más fáciles de averiguar si Firefox se está ejecutando para un usuario determinado y de inspeccionar su estado de proceso.
Examen del estado del proceso
Una forma más sensata de encontrar el PID de un proceso dado es usar pgrep del paquete procps . Por ejemplo:
Luego puede inspeccionar el estado del PID con ps :
o simplemente obtener las banderas estatales sin ninguna otra migaja:
En mi sistema, la línea anterior de arriba consistentemente solo tarda 1.4 milisegundos en completarse. Su experiencia puede ser diferente.
Procesar códigos de estado
La sección CÓDIGOS DE ESTADO DEL PROCESO de ps (1) detalla lo que significan los diversos indicadores de estado. En Ubuntu 14.04, la página del manual dice:
fuente
~/.mozilla/firefox/*/lock
. Luego puede identificar la sesión mirando el nombre del directorio principal de cada archivo de bloqueo. En otras plataformas esto no funciona. Nuestro chat trata más sobre cómo hacerlo funcionar en Mac (lo cual es un poco irrelevante para ubuntu, pero ahí lo tienes). Para ser justos, realmente debería actualizar la pregunta para que sea más específica. : P