Sygnały w linuxie

Jak system może komunikować się z aplikacją?

Sygnały (SIGNALS) są podstawowym sposobem komunikacji w systemie Linux. Komunikacja ta może odbywać się między systemem, a procesem, między użytkownikiem, a procesem oraz między procesami. Jest to mechanizm asynchroniczny (niewymagający potwierdzenia) i na tyle uproszczony, że nie niesie ze sobą żadnej innej informacji (nie ma tu kontenera przechowującego wiadomość). Na podstawie samego numeru sugnału program podejmuje określone działania.

Dla większości sygnałów zdefiniowane są akcje domyślne, dla częśći z nich mogą być one zmienione poprzez napisanie własnego handlera danego sygnału. Sygnał do handlera przypisać można poprzez użycie sygnałowego api (funkcja signal), gdzie jako argumenty podajemy numer sygnału który chcemy obsłużyć i wskaźnik do własnego handlera.

Najprostsza implementacja obsługi sygnałów - przechwycenie "SIUSER1", który mógł np. pochodzić z polecenia "kill -10 [pid_procesu]"

Wykorzystanie sygnału "ALARM" do odmierzania czasu w programie.

Nadchodzące sygnały są kolejkowane w polu "signal" struktury "task_struct". Pole to jest maską w postaci liczby "unsigned long".

Nie ma możliwości pominięcia nowego sygnału, ale nie ma też możliwośći zliczenia kolejnych syganłów tego samego typu.

Nie można również odróżnić kolejnośći w jakiej różne sygnały się pojawiły. W przypadku konieczności zastosowania bardziej zaawansowanej komunikacji należy skorzystać z mechanizmu socketów.

Linux nie jest systemem czasu rzeczywistego - nie jest deterministyczny i nie można przewidzieć jaki będzie czas reakcji systemu na przerwania. Także te programowe. Przerwanie zatem może nie zostać obsłużone natychmiast, więc taki sposób odmierzania czasu nie jest dokładny. Do prostego czekania na reakcje użytkownika, gdzie nie ma znaczenia, czy przykładowe 3 sekundy to dokładnie 3000ms, jest to wystarczające.

Ze względów bezpieczeństwa nie wszystkie sygnały można przechwycić. SIGSTOP i SIGKILL nie mogą zostać zignorowane. Przykładowe implementacje handlerów do obsługi sygnałów można pobrać z mojego repozytorium git

TAGS: linux, sygnaly, gniazda,