Szukam funkcji wiersza polecenia lub funkcji c, która poinformuje mnie, czy plik jest przez coś otwarty / używany.
lsof
i fuser
mówię to, ale zawierają wiele innych informacji, które w niektórych sytuacjach powodują nawet do 300 ms (np. kiedy używam tego kodu w systemie Mac OS X, pracuję dla systemu Linux i OS X) (mam okno rozwiązanie, które zajmuje 5ms, więc próbuję znaleźć coś w Uniksie, które również jest bardzo szybkie i po prostu zwraca true lub false, jeśli plik jest w użyciu)
command-line
files
Noitidart
źródło
źródło
Odpowiedzi:
Jeśli używasz tego jako blokady, to nie będzie działać jak żaden
lsof
lubfuser
zapobiec warunki wyścigu.Podstawowym procesem
lsof
jest przeszukiwanie wszystkich procesów w/proc/*/fs
poszukiwaniu otwartych deskryptorów plików. To zajmie trochę czasu bez względu na to, co robisz.Możesz to zrobić samodzielnie, ale prawdopodobnie nie będzie to szybsze, ponieważ musisz sprawdzać każdy otwarty proces w systemie.
Jeśli to, co robisz, ma krytyczne znaczenie dla czasu, wymyśl inny sposób.
/proc/<PID>/fs
sprawdzić, czy plik jest obecnie otwarty, czy nie. Patrząc tylko na jeden proces, deskryptory otwartych plików będą znacznie szybsze niż mapowanie na wszystkie.Podałeś więcej informacji w komentarzu, który chcesz ustalić, czy Firefox działa w danym systemie. Najlepszym sposobem na to jest poszukiwanie plików blokujących Firefoksa. Są one przechowywane w domyślnych lokalizacjach określonych na wiki Mozilli.
Na przykład, na Linuksie, niech twój program wykona następujące czynności:
~/.mozilla/firefox/
katalog..default
. (Myślę, że wszystkie profile kończą się.default
, jeśli nie tylko indeksowaniem do każdego katalogu).lock
lub.parentlock
. Jeśli widzisz jeden lub oba pliki, Firefox jest otwarty.Ten algorytm powinien działać szybciej niż to, co obecnie robisz w systemie Windows.
źródło
ps aux firefox
. Weź te PID i sprawdź je w/proc/
systemie plików.ps aux firefox
. Moja dokładna sytuacja brzmi: mam ścieżkę do pliku. Jest zablokowany, jeśli Firefox jest uruchomiony. Chcę sprawdzić, czy jest zablokowany, czy nie powiedzieć, czy Firefox jest uruchomiony.TL; DR
W jednym ze swoich komentarzy stwierdzasz:
Twoje pierwotne pytanie dotyczące plików blokujących wydaje się być daleką drogą, gdy istnieją łatwiejsze sposoby, aby dowiedzieć się, czy Firefox działa dla danego użytkownika i sprawdzić jego stan procesu.
Badanie stanu procesu
Bardziej sensownym sposobem znalezienia PID danego procesu jest użycie pgrep z pakietu procps . Na przykład:
Następnie możesz sprawdzić stan PID za pomocą ps :
lub po prostu zdobądź flagi stanu bez żadnych innych cruft:
Jeden z moich systemów, powyższa linijka konsekwentnie zajmuje tylko 1,4 milisekundy. Twój przebieg może się różnić.
Przetwarzaj kody stanu
Sekcja KODY STANU PROCESU ps (1) szczegółowo opisuje znaczenie różnych flag stanu. W Ubuntu 14.04 strona podręcznika mówi:
źródło
~/.mozilla/firefox/*/lock
. Następnie możesz zidentyfikować sesję, patrząc na nazwę katalogu nadrzędnego każdego pliku blokady. Na innych platformach to nie działa. Nasz czat mówi więcej o tym, jak uruchomić go na Macach (co jest trochę nieistotne dla Ubuntu, ale masz go). Aby być uczciwym, naprawdę powinien zaktualizować pytanie, aby było bardziej szczegółowe. : P