Estou procurando uma função de linha de comando ou função c que me informe se um arquivo está aberto / em uso por algo.
lsof
e fuser
conte isso, mas eles fornecem muitas outras informações que resultam em até 300ms em algumas situações (como quando eu uso esse código no MAC OS X, estou desenvolvendo para Linux e OS X) (eu tenho um windows solução que leva 5ms, então estou tentando encontrar algo no Unix que também seja muito rápido e retorne verdadeiro ou falso se o arquivo estiver em uso)
command-line
files
Noitidart
fonte
fonte
Respostas:
Se você estiver usando isso como um bloqueio, não vai funcionar como nenhum
lsof
oufuser
evitar condições de corrida.O processo básico
lsof
é vasculhar todos os processos que/proc/*/fs
procuram descritores de arquivos abertos. Isso vai levar tempo, não importa o que você faça.Você pode fazer isso sozinho, mas não é provável que seja mais rápido, pois você deve verificar todos os processos abertos no sistema.
Se o que você está fazendo é crítico em termos de tempo, descubra outra maneira de fazê-lo.
/proc/<PID>/fs
ver se seu arquivo está aberto ou não. Analisar apenas um dos descritores de arquivo aberto dos processos será muito mais rápido que o mapeamento em todos eles.Você forneceu mais informações em um comentário que deseja determinar se o Firefox está sendo executado em um determinado sistema. A melhor maneira de fazer isso é procurar os arquivos de bloqueio do Firefox. Eles são armazenados nos locais padrão especificados no wiki do Mozilla.
Por exemplo, no linux, faça com que seu programa faça o seguinte:
~/.mozilla/firefox/
diretório.default
. (Acho que todos os perfis terminam com.default
, se não apenas rastrear todos os diretórios.)lock
or.parentlock
. Se você vir um ou ambos os arquivos, o Firefox está aberto.Esse algoritmo deve executar mais rapidamente do que o que você faz no Windows atualmente.
fonte
ps aux firefox
. Pegue esses PIDs e procure-os no/proc/
sistema de arquivos.ps aux firefox
. Bem, minha situação exata é: eu tenho o caminho para um arquivo. Está bloqueado se o Firefox estiver em execução. Eu quero ver se está bloqueado ou não para dizer se o Firefox está em execução.TL; DR
Em um de seus comentários , você declara:
Sua pergunta original sobre arquivos de bloqueio parece ser o longo caminho, quando há maneiras mais fáceis de descobrir se o Firefox está sendo executado para um determinado usuário e inspecionar o estado do processo.
Examinando o estado do processo
Uma maneira mais sensata de encontrar o PID de um determinado processo é usar o pgrep do pacote procps . Por exemplo:
Você pode inspecionar o estado do PID com ps :
ou apenas obtenha as bandeiras de estado sem nenhum outro problema:
No meu sistema, o one-liner acima leva consistentemente apenas 1,4 milissegundos para ser concluído. Sua milhagem pode variar.
Códigos de estado do processo
A seção PROCESS STATE CODES do ps (1) detalha o que significam os vários sinalizadores de estado. No Ubuntu 14.04, a página do manual diz:
fonte
~/.mozilla/firefox/*/lock
. Você pode identificar a sessão observando o nome do diretório pai de cada arquivo de bloqueio. Em outras plataformas, isso não funciona. Nosso bate-papo aborda mais como fazê-lo funcionar em macs (o que é meio irrelevante para o ubuntu, mas você já sabe). Para ser justo, ele realmente deve atualizar a pergunta para ser mais específica. : P