2010-09-03 18 views
6

Podczas gdy proces wykonuje blokujące wywołanie systemowe, np. Odczyt lub zapis, nadszedł sygnał. Czy wywołanie systemowe jest zakończone z błędem EINTR? Czy wywołanie systemowe jest ponownie uruchamiane po obsłudze wywołania systemowego?Problem z obsługą sygnałów, obsługą przerwań

Załóżmy, że wywołanie systemowe jest zakończone z błędem EINTR, Kernel obsługuje sygnał przed przywróceniem do przestrzeni użytkownika.

Czy uchwyt sygnału jest wykonywany w trybie użytkownika/trybie jądra? Jeśli jest w trybie użytkownika, nastąpi powrót do instrukcji po wywołaniu systemowym (odczyt/zapis), podczas którego przybył sygnał lub ponownie przechodzi do trybu jądra po obsłudze sygnału i wraca do użytkownika z ret_from_syscall. W jaki sposób wznowienie wykonywania następuje w instrukcji obok wywołania systemowego, podczas którego przybył sygnał?

Czy można ponownie uruchomić system, przekazując znacznik SA_RESTART w sigaction?

Odpowiedz

3

sygnału jest wykonywana w trybie użytkownika , ale z innym użytkownikiem kontekście, a następnie powrócić do jądra, które wracają do user_mode z ret_from_syscall. Zachowanie wywołania systemowego, gdy moduł obsługi sygnału jest zainstalowany z SA_RESTART, zależy od wywołania systemowego.

której opis wywołania systemowego ponownym uruchomieniu jest dostępna w najnowszej wersji signal overview manpage:

man 7 signal 

Jeśli flaga SA_RESTART nie jest używany, funkcja systemowa nie jest uruchomiony ponownie.

+1

Teraz mam to, co masz na myśli przez sygnał jest wykonywany w trybie użytkownika z innym kontekstem użytkownika. W przypadku, gdy proces odbiera sygnał, proces przełącza się do trybu jądra, aby obsłużyć wyjątek tam, gdzie ustawiona jest maska ​​bitowa matrycy sygnału bieżącego procesu. Bezpośrednio przed powrotem do trybu użytkownika, jądro sprawdza sygnał oczekujący i wywołuje funkcję do_signal, aby obsłużyć sygnał, który z kolei wywołuje handle_signal, który kopiuje kontekst sprzętowy jądra i modyfikuje stos trybu użytkownika poprzez wywołanie setup_frame. –

+0

Nowa ramka stos zawiera signum, wartość PC wskazuje na tryb obsługi sygnału użytkownika, pole adresu zwrotnego zawierające adres wywołania systemowego sigreurn. Po powrocie do trybu użytkownika, rozpoczyna uruchamianie procedury obsługi sygnału, a po zakończeniu wywołuje sigreturn, co powoduje, że proces przełącza się do trybu jądra, gdzie w kontekście sprzętowym z stosu trybu użytkownika jest kopiowany z powrotem do stosu jądra przez restore_sigcontext (przywracanie stosu trybów użytkownika do pierwotnego stanu). Gdy wywołanie systemowe typu "sigrendurn" przerywa proces przełączania z powrotem do trybu użytkownika i kontynuuje od miejsca, w którym pozostaje przed sygnałem. –

+0

Należy zauważyć, że SA_RESTART nie zawsze ma zastosowanie. Niektóre interfejsy nigdy nie są ponownie uruchamiane po przerwaniu przez procedurę obsługi sygnału, niezależnie od użycia SA_RESTART; zawsze kończą się błędem EINTR po przerwaniu przez procedurę obsługi sygnału. Sprawdź [Strona man man dla szczegółów] (http://man7.org/linux/man-pages/man7/signal.7.html). – kikeenrique