2012-10-27 16 views
5

Chcę zaimplementować zachowanie w moim programie C, tak aby po podpisaniu SIGINT zamknąłem wszystkie otwarte deskryptory plików. Czy istnieje prosty sposób na ich listę?C otrzymuję wszystkie otwarte deskryptory plików

+2

Szukaj obsługi sygnałów. –

+1

dlaczego chcesz coś takiego? – qdot

+1

po 'exit();' lub 'return' z głównego, jądro powinno zamknąć dla ciebie te deskryptory plików. – yeyo

Odpowiedz

5

Użyłbym brutalnej siły: for (i = 0; i < fd_max; ++i) close (i);. Szybki i całkiem przenośny.

+0

Oczywiście o wiele łatwiej, tak! -) Ale wyścig może nadal stanowić problem. – alk

+3

Możesz użyć 'getrlimit (RLMIIT_NOFILE, & rlim)', aby znaleźć maksymalne 'fd_max'. –

+0

Czy na pewno chcesz zamknąć deskryptory plików dla 'stdin'. 'stdout' i' stderr' (0, 1, 2)? – alk

3

Śledź wszystkie otwarte deskryptory plików i zamykaj je pojedynczo.

W ogólnym przypadku używana biblioteka może mieć otwarty plik, a zamknięcie go spowoduje niepoprawne działanie biblioteki.

W rzeczywistości ten sam problem mógł wystąpić w twoim własnym kodzie, ponieważ jeśli zamkniesz deskryptory plików bezkrytycznie, ale inna część twojego programu nadal pamięta deskryptor pliku i spróbuje go użyć, otrzyma nieoczekiwany błąd lub (jeśli inne pliki zostały otwarte od) działają na złym pliku. Znacznie lepiej, aby składnik odpowiedzialny za otwieranie pliku był odpowiedzialny za jego zamknięcie.

2

Możesz przeczytać zawartość /proc/<pid>/fd., jeśli jest dostępna.

Należy jednak pamiętać o potencjalnym wyścigu, który może wystąpić, jeśli aplikacja zamknie niektóre lub otworzy nowe między odczytanym /proc/<pid>/fd, a zamkniesz to, co czytasz.

Podsumowując, chcę polecić podejście Kevina Reida do tego.

+0

Dlaczego zakładasz, że '/ proc' jest dostępny? Chodzi o najbardziej niewiarygodny koszmar w swojej istocie. – Jens

+0

Masz rację. Zmodyfikowałem mój komentarz, aby był odpowiedni tylko dla niektórych systemów. @ Jen – alk

+0

Jeśli chodzi o przenośność, możesz przeczytać '/ dev/fd /'. Jest to bardziej przenośne niż '/ proc/self/fd'. –

1

Moje rozwiązanie dla systemów POSIX:

Wszystkie otwarte FD to najniższa wartość to możliwe.
Utwórz funkcję opakowania po open(2).
Twoja nowa funkcja otwiera (i zwraca) żądane fd i przekazuje jego wartość do funkcji o nazwie define_if_is_the_higtest_fd_and_store_it().
Powinieneś mieć int hightest_fd_saved dostępne tylko dla funkcji singleton (istnieje tylko 1 "tablica deskryptorów") o nazwie save_fd() (wartość początkowa to 3 (bo stderr jest 2)).
Konfiguracja SIGINT do funkcji sygnału. Wewnątrz robisz pętlę z [3, return_fd()].

myślę, że jest to ...

Powiązane problemy