2009-08-22 14 views
10

Jak znaleźć wszystkie otwarte pliki w procesie (od środka)?Zamykanie wszystkich otwartych plików w procesie

Wydaje się to przydatne wiedzieć po fork() (przed exec()).

wiem o istnieniu w getdtablesize() i bardziej przenośny sysconf(_SC_OPEN_MAX), ale wydaje się nieskuteczne próby zamykania każdego ważny deskryptor, czy jest otwarty plik za nim czy nie. (Jestem również świadomy niebezpieczeństw związanych z przedwczesną optymalizacją. Chodzi raczej o estetykę :-)

Odpowiedz

3

Może zabrzmieć nieefektywność próby zamknięcia wszystkich deskryptorów plików, ale tak naprawdę nie jest tak źle. Implementacja wywołania systemowego do wyszukiwania deskryptora pliku powinna być dość wydajna, jeśli system jest dobry.

Jeśli chcesz znaleźć tylko zamknąć otwarte deskryptory plików, możesz użyć systemu plików proc w systemach, w których istnieje. Na przykład. w systemie Linux,/proc/self/fd wyświetli listę wszystkich otwartych deskryptorów plików. Powtórz ten katalog i zamknij wszystko> 2, wyłączając deskryptor pliku oznaczający katalog, który iterujesz.

8

Jeśli program zostanie wywołanie fork i exec, to naprawdę powinien otwierać wszystkie deskryptory plików z flagą O_CLOEXEC, dzięki czemu nie trzeba ręcznie zamknąć je przed exec. Możesz także użyć fcntl, aby dodać tę flagę po otwarciu pliku, ale podlega to warunkom wyścigu w programach wielowątkowych.

+0

Witamy w wyścigach. – ybungalobill

Powiązane problemy