2011-08-30 44 views
5

Piszę program Windows na Linuksie. Mój program używa strukturalnej obsługi wyjątków systemu Windows (SEH). Linux nie obsługuje strukturalnej obsługi wyjątków, jednak zapewnia obsługę sygnałów. Możemy przesłonić sygnał, aby stworzyć paradygmat podobny do SEH.Obsługa wyjątków w Linuksie

Gdy jesteś w stanie filtrować wyjątek systemu Windows zapewnia trzy alternatywy przepływy kontroli wykonania:

1) EXCEPTION_EXECUTE_HANDLER: Wykonanie obsługi 2) EXCEPTION_CONTINUE_SEARCH: przekazanie wyjątek od następnego bloku (jeśli nie istnieje następnie OS) 3) EXCEPTION_CONTINUE_EXECUTION: Kontynuuj wyjątek od instrukcji, w której wystąpiło przerwanie.

W jaki sposób mogę uzyskać te przepływy sterowania w systemie Linux. W Linuksie po obsłużeniu sygnału program rozpoczyna wykonywanie od miejsca, w którym został przerwany. Jak rozwinąć paradygmaty continue_search i execute_handler?

góry dzięki

Odpowiedz

5

Nie ma łatwego sposobu, aby robić to, co chcesz tutaj w C++. Twoje narzędzia są standardowym mechanizmem wyjątków C++ i sigaction. Obsługę sigaction można przywrócić do miejsca, w którym zostało przerwane. Może rzucić, choć istnieją kontrowersje na temat bezpieczeństwa tego. Niektórzy powiedzieliby, że musi ustawić zmienną atomową i powrócić. (Problem polega na tym, że kompilator nie widzi możliwości rzutu, więc się do niego nie przygotowuje).

Jeśli pracujesz w C, masz dodatkowe złożone opcje obejmujące sigsetjmp, czyli mniej więcej na sterydy , ryzyko i wszystko.

Ponieważ nie określono języka lub wyjątkowego warunku, z którym próbujesz sobie poradzić, nie jest praktyczne oferowanie bardziej konkretnego przepisu.

+0

Dziękuję za odpowiedź. – Utkarsh

+0

Używam języka C++. Może być wymagane wyodrębnienie tej funkcji i utworzenie pliku obiektu współużytkowanego. Obawiam się również, czy mogę obsługiwać przetwarzanie sygnałów w ramach biblioteki współdzielonej. Co więcej, jeśli twórca aplikacji przesłonił sygnał innym programem obsługi. – Utkarsh

+0

Przeczytałem abou sigaction. Jak już wspomniano, przywraca kontrolę do miejsca, w którym zostało przerwane. Wymagam jednak również przeskoku/wykonania określonego kodu z pominięciem istniejącego przepływu (wykonaj blok catch i kontynuuj wyszukiwanie w powyższych blokach). Nie wiem, jak osiągnąć tę funkcję. – Utkarsh