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
Odpowiedz
Użyłbym brutalnej siły: for (i = 0; i < fd_max; ++i) close (i);
. Szybki i całkiem przenośny.
Ś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.
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.
Dlaczego zakładasz, że '/ proc' jest dostępny? Chodzi o najbardziej niewiarygodny koszmar w swojej istocie. – Jens
Masz rację. Zmodyfikowałem mój komentarz, aby był odpowiedni tylko dla niektórych systemów. @ Jen – alk
Jeśli chodzi o przenośność, możesz przeczytać '/ dev/fd /'. Jest to bardziej przenośne niż '/ proc/self/fd'. –
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 ...
- 1. Czy przed zamknięciem należy zamknąć deskryptory plików?
- 2. Jak mogę przywrócić wszystkie otwarte pliki?
- 3. msbuild.exe pozostanie otwarte, blokowanie plików
- 4. Uzyskaj wszystkie połączenia TCP otwarte przez aplikację przy użyciu C#
- 5. Czy deskryptory plików są udostępniane, gdy fork() ing?
- 6. Jak zamknąć wszystkie otwarte karty naraz?
- 7. lsof powinien dać wszystkie otwarte pliki dla zestawu pidów
- 8. Wyzwalacze FileSystemWatcher dla strumienia plików otwarte
- 9. Deskryptory Fouriera Matlaba, co jest nie tak?
- 10. Jak zamknąć wszystkie otwarte pliki sieciowe w PowerShell?
- 11. Deskryptory obrazu z SIFT/VLFEAT
- 12. Otrzymuję "klang: błąd: brak plików wejściowych"
- 13. Jak znaleźć otwarte globalne uchwyty plików w programie perla
- 14. Jak znaleźć wszystkie otwarte/aktywnych połączeń w DB2 (8.x)
- 15. Otwórz wszystkie linki zewnętrzne otwarte w nowej karcie poza domeną
- 16. Czy możesz zamknąć wszystkie otwarte okna w kapibarze?
- 17. Moje deskryptory plików procesu java są "złe" i nie mam pojęcia, dlaczego
- 18. Sortuj deskryptory za pomocą NSFetchedResultsController - Swift
- 19. Dlaczego otrzymuję komunikat "Zbyt wiele otwartych plików - konwertuj" z Paperclip?
- 20. Jak zabić wszystkie procesy, które zostały otwarte przez skrypt powłoki po Ctrl + C?
- 21. BindException/Zbyt wiele plików otwarte podczas używania HttpClient pod obciążeniem
- 22. vim: otwarte 4 plików podzielony poziomo i pionowo
- 23. libcurl - Zachowaj połączenie "otwarte", aby przesłać wiele plików (FTP)
- 24. C# Usuń wszystkie puste podkatalogi.
- 25. SharpSVN odczytuje WSZYSTKIE nazwy plików
- 26. Czy deskryptory własności javascript obsługują atrybuty niestandardowe?
- 27. Deskryptory i atrybuty dostarczone przez Pythona
- 28. Deskryptory w języku Python ze staromodnymi klasami
- 29. Otrzymuję strumień obiektu gniazda w C#
- 30. Przenoszenie plików w C#
Szukaj obsługi sygnałów. –
dlaczego chcesz coś takiego? – qdot
po 'exit();' lub 'return' z głównego, jądro powinno zamknąć dla ciebie te deskryptory plików. – yeyo