Provided by: manpages-pl_4.23.1-1_all bug

NAZWA

       signal - przegląd sygnałów

OPIS

       Linux  wspiera  zarówno  rzeczywiste  sygnały  POSIX-owe  (zwane  dalej „sygnałami standardowymi”), jak i
       sygnały POSIX-owe czasu rzeczywistego.

   Zachowania sygnału
       Każdy sygnał ma przypisane bieżące zachowanie, które określa reakcję procesu na dostarczony sygnał.

       Wpisy w  kolumnie  „Akcja”  tabel  określają  domyślne  zachowanie  dla  danego  sygnału,  jako  jedno  z
       następujących:

       Term   Domyślną akcją jest przerwanie procesu.

       Ign    Domyślną akcją jest zignorowanie sygnału.

       Core   Domyślną akcją jest przerwanie procesu i zapisanie obrazu pamięci (patrz core(5)).

       Stop   Domyślną akcją jest zatrzymanie procesu.

       Cont   Domyślną akcją jest kontynuowanie procesu, jeżeli jest obecnie zatrzymany.

       Proces  może  zmienić  zachowanie  się sygnału, używając sigaction(2) lub signal(2) (to drugie jest mniej
       przenośne, jeśli chodzi o ustawianie akcji obsługi sygnału; szczegóły opisano w signal(2)). Używając tych
       wywołań systemowych, proces może wybrać jedną z  poniższych  reakcji  na  dostarczenie  sygnału:  wykonać
       domyślną akcję, zignorować sygnał, przejąć sygnał wykonując procedurę obsługi sygnału, czyli podaną przez
       programistę funkcję, wywoływaną automatycznie po dostarczeniu sygnału.

       Domyślnie  procedura  obsługi sygnału jest uruchamiana na normalnym stosie procesu. Można to zmienić, tak
       żeby używany był stos alternatywny; szczegóły, jak i po co to robić, można znaleźć w sigaltstack(2)

       Zachowanie sygnału jest atrybutem poszczególnych procesów: w aplikacji  wielowątkowej  zachowanie  danego
       sygnału jest takie samo dla wszystkich wątków.

       Potomek  utworzony przez fork(2) dziedziczy kopię ustawień sygnałów od swojego rodzica. Podczas wywołania
       execve(2) przywracane są wartości domyślne ustawień, z wyjątkiem ustawienia  ignorowania  sygnału,  które
       nie jest zmieniane.

   Wysyłanie sygnału
       Następujące wywołania systemowe lub funkcje biblioteczne umożliwiają wysyłanie sygnałów:

       raise(3)
              Wysyła sygnał do wątku, który wywołał tę funckję.

       kill(2)
              Wysyła  sygnał  do  podanego  procesu  lub  do  wszystich  członków podanej grupy procesów, lub do
              wszystkich procesów w systemie.

       pidfd_send_signal(2)
              Wysyła sygnał do procesu identyfikowanego za pomocą deskryptora pliku PID.

       killpg(3)
              Wysyła sygnał do wszystkich członków podanej grupy procesów.

       pthread_kill(3)
              Wysyła sygnał do podanego wątku POSIX w tym samym procesie, co proces wywołujący.

       tgkill(2)
              Wysyła sygnał do  podanego  wątku  w  podanym  procesie  (jest  to  używane  do  zaimplementowania
              pthread_kill(3)).

       sigqueue(3)
              Wysyła sygnał czasu rzeczywistego wraz z powiązanymi danymi do podanego procesu.

   Oczekiwanie na przechwycenie sygnału
       Następujące  wywołania  systemowe  zawieszają  wykonywanie  wywołującego  je  wątku do momentu obsłużenia
       sygnału (lub do momentu, w którym nieobsłużony sygnał spowoduje zakończenie procesu).

       pause(2)
              Zawiesza wykonywanie do momentu złapania sygnału.

       sigsuspend(2)
              Tymczasowo zmienia maskę sygnału (patrz niżej) i zawiesza  wykonywanie  do  momentu  przechwycenia
              jednego z niemaskowanych sygnałów.

   Synchroniczne akceptowanie sygnału
       Zamiast asynchronicznego przechwytywania sygnału przez procedurę jego obsługi, możliwe jest synchroniczne
       akceptowanie  sygnałów,  czyli blokowanie wykonywania do czasu dostarczenia sygnału, w którym to momencie
       jądro zwraca informacje o sygnale do funkcji wywołującej. W ogólności można to zrobić na dwa sposoby:

       •  sigwaitinfo(2), sigtimedwait(2) oraz sigwait(3) zawieszają wykonanie aż do chwili dostarczenia jednego
          z sygnałów należącego do podanego zbioru sygnałów. Każde z tych wywołań systemowych zwraca  informacje
          o dostarczonym sygnale.

       •  signalfd(2)  zwraca  deskryptor  pliku,  którego  można  użyć  do  odczytania  informacji  o sygnałach
          dostarczanych do procesu wywołującego. Każda operacja odczytu za pomocą  read(2)  z  tego  deskryptora
          pliku  jest blokowana do czasu dostarczenia do programu wywołującego jednego z sygnałów przekazanych w
          zbiorze signalfd(2). Bufor zwracany przez read(2) zawiera strukturę opisującą sygnał.

   Maska sygnału i sygnały oczekujące
       Sygnał może być zablokowany, co oznacza, że nie zostanie dostarczony, dopóki się go nie odblokuje. Sygnał
       jest nazywany oczekującym, jeżeli został już wygenerowany, ale nie został jeszcze dostarczony.

       Każdy wątek procesu ma swoją niezależną maskę sygnałów, określającą zbiór  sygnałów  obecnie  blokowanych
       przez  wątek.  Wątek  może zmieniać maskę sygnałów, używając pthread_sigmask(3). Tradycyjna, jednowątkowa
       aplikacja może do tego celu użyć sigprocmask(2).

       Dziecko utworzone  przez  fork(2)  dziedziczy  kopię  maski  sygnałów  od  swojego  rodzica.  Maska  jest
       zachowywana podczas wywołań execve(2).

       Sygnał  może  być  kierowany  do  procesu  lub  kierowany  do  wątku.  Sygnał  kierowany  do procesu jest
       przeznaczony do (i oczekujący wobec) całego procesu. Sygnał  może  być  kierowany  do  procesu,  ponieważ
       został  wygenerowany  przez jądro, z powodów innych niż wyjątek sprzętowy albo ponieważ został wysłany za
       pomocą kill(2) lub sigqueue(3). Sygnał kierowany do wątku jest przeznaczony do konkretnego wątku.  Sygnał
       może  być kierowany do wątku, ponieważ został wygenerowany w konsekwencji wykonania specjalnej instrukcji
       języka maszynowego, która wyzwoliła wyjątek sprzętowy (np. SIGSEGV w przypadku nieprawidłowego dostępu do
       pamięci lub SIGFPE w przypadku błędu matematycznego) albo ponieważ jest kierowany  do  konkretnego  wątku
       poprzez interfejs taki jak tgkill(2) lub pthread_kill(3).

       Sygnał  kierowany  do  procesu  może  być  dostarczony do dowolnego z wątków, który aktualnie nie blokuje
       sygnału. Jeśli więcej niż jeden wątków ma odblokowany sygnał, jądro wybiera wątek,  do  którego  zostanie
       dostarczony sygnał, w sposób dowolny.

       Wątek  może pobrać zbiór obecnie oczekujących sygnałów, używając sigpending(2). Zbiór ten będzie zawierał
       sygnały oczekujące skierowane zarówno do całego procesu, jak i do wywołującego wątku.

       Zbiór sygnałów oczekujących dziecka utworzonego przez fork(2) jest na samym  początku  pusty.  Zbiór  ten
       jest zachowywany podczas execve(2).

   Wykonanie procecedur obsługi sygnałów
       Gdy  tylko  zachodzi  przejście  wykonania  z  trybu  jądra  do trybu użytkownika (np. powrót z wywołania
       systemowego  lub  zakolejkowanie  wątku  do  procesora)  jądra  sprawdza,   czy   występuje   oczekujący,
       niezablokowany  sygnał,  dla  którego  proces  ustanowił procedurę obsługi sygnału. Jeśli taki oczekujący
       sygnał występuje, mają miejsce poniższe kroki:

       (1)  Jądro przeprowadza niezbędne działania przygotowawcze do wykonania procedury obsługi sygnału:

            (1.1)  Sygnał jest usuwany ze zbioru oczekujących sygnałów.

            (1.2)  Jeśli sygnał został zainstalowany wywołaniem do sigaction(2) ze znacznikiem  SA_ONSTACK  oraz
                   wątek  zdefiniował  alternatywny  stos  sygnałów  (za  pomocą sigaltstack(2)) — stos ten jest
                   instalowany.

            (1.3)  Różne części kontekstu związanego z sygnałem są zapisywane do specjalnej  ramki,  która  jest
                   tworzona na stosie. Zapisywane informacje obejmują:

                   •  Rejestr  licznika  rozkazów  (tj.  adres  następnej  instrukcji w głównym programie, która
                      powinna być wykonana po powrocie z procedury obsługi sygnału);

                   •  Stan rejestru zależny od architektury, wymagany do wznowienia przerwanego programu;

                   •  bieżąca maska sygnałów wątku;

                   •  ustawienia alternatywnego stosu sygnałów wątku.

                   (Jeśli procedurę obsługi sygnału zainstalowano przy użyciu znacznika SA_SIGINFO sigaction(2),
                   powyższe informacje są dostępne za  pomocą  obiektu  ucontext_t,  na  który  wskazuje  trzeci
                   argument procedury obsługi sygnału).

            (1.4)  Wszelkie  sygnały  podane  w  act->sa_mask  przy  rejestracji  procedury  obsługi przy użyciu
                   sigprocmask(2) są dodawane do maski sygnałów wątku. Dostarczany sygnał jest również  dodawany
                   do  maski  sygnałów,  chyba  że  przy rejestracji procedury obsługi podano SA_NODEFER. Z tego
                   powodu, te sygnały są blokowane w trakcie wykonywania procedury obsługi.

       (2)  Jądro tworzy ramkę na stosie, dla procedury obsługi sygnału.  Jądro  ustawia  licznik  rozkazów  dla
            wątku tak, aby wskazywał na pierwszą instrukcję funkcji obsługi sygnału i konfiguruje adres powrotny
            dla  tej  funkcji  tak, aby wskazywał na kod w przestrzeni użytkownika znany jako trampolina sygnału
            (opisany w podręczniku sigreturn(2)).

       (3)  Jądro zwraca kontrolę do przestrzeni użytkownika, gdzie wykonanie zaczyna się  na  początku  funkcji
            obsługi sygnału.

       (4)  Gdy procedura obsługi sygnału powróci, kontrola jest przekazywana do kodu trampoliny sygnału.

       (5)  Trampolina  sygnału  wywołuje  sigreturn(2), wywołanie systemowe, które za pomocą informacji w ramce
            stosu utworzonej w kroku 1, przywraca wątek do stanu sprzed  wywołania  procedury  obsługi  sygnału.
            Jako część tej procedury, przywracana jest maska sygnałów wątku oraz ustawienia alternatywnego stosu
            sygnałów. Po zakończeniu wywołania sigreturn(2), jądro przekazuje kontrolę z powrotem do przestrzeni
            użytkownika, a wątek zaczyna wykonanie w punkcie, w którym był przerwany procedurą obsługi sygnału.

       Proszę  zauważyć,  że  jeśli procedura obsługi sygnału nie powróci (np. kontrola zostanie przekazana poza
       procedurę obsługi  za  pomocą  siglongjmp(3)  albo  procedura  obsługi  wykona  nowy  program  za  pomocą
       execve(2)),  to  ostatni  krok  nie  jest wykonywany. W szczególności, w takich przypadkach to po stronie
       programisty leży odpowiedzialność za przywrócenie stanu  maski  sygnałów  (przy  użyciu  sigprocmask(2)),
       jeśli  pożądane  jest  odblokowanie sygnałów, które zostały zablokowane przy wejściu do procedury obsługi
       sygnału (proszę zauważyć, że siglongjmp(3) może, ale nie musi przywrócić maski sygnałów, w zależności  od
       wartości savesigs podanej w odpowiednim wywołaniu do sigsetjmp(3)).

       Z  punktu  widzenia jądra, wykonanie kodu procedury obsługi sygnału jest identyczne jak wykonanie każdego
       innego kodu w przestrzeni użytkownika. Oznacza to, że jądro nie zapisuje żadnych specjalnych informacji o
       stanie wskazujących, że wątek jest aktualnie wykonywany w procedurze obsługi sygnału. Wszystkie niezbędne
       informacje o stanie są utrzymywane  w  rejestrach  w  przestrzeni  użytkownika  i  stosie  w  przestrzeni
       użytkownika.  Głębokość zagnieżdżenia wywoływanych procedur obsługi sygnału zależy zatem tylko od stosu w
       przestrzeni użytkownika (i rozsądnego projektu oprogramowania!).

   Sygnały standardowe
       Linux obsługuje sygnały standardowe wypisane niżej. Druga kolumna wskazuje jaki standard (o ile w  ogóle)
       określa  sygnał:  „P1990”  oznacza,  że sygnał był opisany w pierwotnym standardzie POSIX.1-1990; „P2001”
       wskazuje, że sygnał dodano w SUSv2 i POSIX.1-2001.
       Sygnał      Standard   Akcja   Komentarz
       ─────────────────────────────────────────────────────────────────────────
       SIGABRT      P1990     Core    Sygnał abort od abort(3)
       SIGALRM      P1990     Term    Sygnał timera od alarm(2)
       SIGBUS       P2001     Core    Błąd szyny (niepr. dostęp do pamięci)
       SIGCHLD      P1990      Ign    Potomek zatrzymał się lub zakończył pracę
       SIGCLD         -        Ign    Synonim SIGCHLD
       SIGCONT      P1990     Cont    Kontynuuj, jeśli się zatrzymał
       SIGEMT         -       Term    Pułapka emulatora
       SIGFPE       P1990     Core    Wyjątek zmiennoprzecinkowy
       SIGHUP       P1990     Term    Zawieszenie wykryte na terminalu kontrol.
                                      lub śmierć procesu kontrolującego
       SIGILL       P1990     Core    Nielegalna instrukcja
       SIGINFO        -               Synonim SIGPWR
       SIGINT       P1990     Term    Przerwanie nakazane z klawiatury
       SIGIO          -       Term    I/O teraz możliwe (4.2BSD)
       SIGIOT         -       Core    Pułapka IOT. Synonim SIGABRT
       SIGKILL      P1990     Term    Sygnał Kill
       SIGLOST        -       Term    Utracono blokadę pliku (nieużywane)
       SIGPIPE      P1990     Term    Uszkodzony potok: zapis do potoku bez
                                      odczytujących; zob. pipe(7)
       SIGPOLL      P2001     Term    Zdarzenie odpytywalne (Sys V);
                                      synonim dla SIGIO
       SIGPROF      P2001     Term    Przeterminowanie zegara profilowego
       SIGPWR         -       Term    Błąd zasilania (System V)
       SIGQUIT      P1990     Core    Wyjście nakazane z klawiatury
       SIGSEGV      P1990     Core    Nieprawidłowa referencja pamięciowa
       SIGSTKFLT      -       Term    Błąd stosu koprocesora (nieużywany)
       SIGSTOP      P1990     Stop    Zatrzymaj proces
       SIGTSTP      P1990     Stop    Zatrzymanie napisane z terminala
       SIGSYS       P2001     Core    Nieprawidłowe wywołanie systemowe (SVr4);
                                      zob. też seccomp(2)
       SIGTERM      P1990     Term    Sygnał zakończenia pracy
       SIGTRAP      P2001     Core    Śledzenie/pułapka kontrolna
       SIGTTIN      P1990     Stop    Wejście terminala dla procesu w tle
       SIGTTOU      P1990     Stop    Wyjście terminala dla procesu w tle
       SIGUNUSED      -       Core    Synonimiczny z SIGSYS
       SIGURG       P2001      Ign    Pilny warunek na gnieździe (4.2BSD)
       SIGUSR1      P1990     Term    Sygnał 1 użytkownika
       SIGUSR2      P1990     Term    Sygnał 2 użytkownika
       SIGVTALRM    P2001     Term    Wirtualny zegar alarmu (4.2BSD)
       SIGXCPU      P2001     Core    Przekroczone ogran. czasu CPU (4.2BSD)
                                      zob. setrlimit(2)
       SIGXFSZ      P2001     Core    Przekr. ogran. rozmiaru pliku (4.2BSD)
                                      zob. setrlimit(2)
       SIGWINCH       -        Ign    Sygnał zmiany rozm. okna (4.3BSD, Sun)

       Sygnałów SIGKILL oraz SIGSTOP nie można przechwycić, zablokować ani zignorować.

       Do wersji 2.2 Linuksa (włącznie) domyślne zachowanie dla  sygnałów  SIGSYS,  SIGXCPU,  SIGXFSZ  oraz  (na
       architekturach  innych  niż  SPARC i MIPS) SIGBUS polegało na przerwaniu procesu (bez zrzutu pamięci). (W
       niektórych innych Uniksach domyślne zachowanie dla SIGXCPU i SIGXFSZ polega  na  przerwaniu  procesu  bez
       zrzutu  pamięci). Linux 2.4 jest zgodny ze wymaganiami standardu POSIX.1-2001 dotyczącymi tych sygnałów i
       przerywa proces ze zrzutem pamięci.

       SIGEMT nie jest wymieniony w POSIX.1-2001, lecz pomimo  to  pojawia  się  w  większości  innych  Uniksów.
       Domyślną akcją dla tego sygnału jest zazwyczaj przerwanie procesu ze zrzutem pamięci.

       SIGPWR  (niewymieniony  w  POSIX.1-2001)  jest  zazwyczaj domyślnie ignorowany w tych Uniksach, w których
       występuje.

       SIGIO (niewymieniony w POSIX.1-2001) jest domyślnie ignorowany w niektórych innych Uniksach.

   Kolejkowanie i semantyka dostarczania sygnałów standardowych
       Jeśli na proces oczekuje kilka sygnałów standardowych, kolejność,  w  jakiej  zostaną  dostarczone,  jest
       nieokreślona.

       Sygnały  standardowe  nie  są kolejkowane. Jeśli w trakcie blokowania sygnału wygenerowane zostanie wiele
       wystąpień sygnału standardowego, to tylko jedno jego wystąpienie jest oznaczane  jako  oczekujące  (i  po
       jego  odblokowaniu,  sygnał  zostanie  dostarczony  jeden  raz).  W  przypadku,  gdy  istnieje już sygnał
       oczekujący, struktura siginfo_t (zob. sigaction(2)) związana z danym sygnałem nie  jest  nadpisywana,  po
       nadejściu  kolejnych wystąpień tego samego sygnału. Proces otrzyma zatem informacje powiązane z pierwszym
       występieniem danego sygnału.

   Numerowanie sygnałów, w zakresie sygnałów standardowych
       Wartość numeryczna każdego sygnału jest podana w poniższej tabeli. Jak wskazano w tabeli, wiele  sygnałów
       ma  zróżnicowane  wartości  numeryczne  na  różnych  architekturach. Pierwsza wartość numeryczna w każdym
       wierszu tabeli ukazuje numer sygnału na architekturze x86, ARM i  większości  innych  architektur;  druga
       wartość  dotyczy  Alpha  i SPARC; trzecia — MIPS; a ostatnia — PARISC. Kreska (-) wskazuje, że sygnał nie
       występuje na danej architekturze.
       Sygnał          x86/ARM        Alpha/   MIPS   PARISC   Uwagi
                   większość innych   SPARC
       ──────────────────────────────────────────────────────────────────
       SIGHUP              1             1       1       1
       SIGINT              2             2       2       2
       SIGQUIT             3             3       3       3
       SIGILL              4             4       4       4
       SIGTRAP             5             5       5       5
       SIGABRT             6             6       6       6
       SIGIOT              6             6       6       6
       SIGBUS              7            10      10      10
       SIGEMT             -              7       7      -
       SIGFPE              8             8       8       8
       SIGKILL             9             9       9       9
       SIGUSR1            10            30      16      16
       SIGSEGV            11            11      11      11
       SIGUSR2            12            31      17      17
       SIGPIPE            13            13      13      13
       SIGALRM            14            14      14      14
       SIGTERM            15            15      15      15
       SIGSTKFLT          16            -       -        7
       SIGCHLD            17            20      18      18
       SIGCLD             -             -       18      -
       SIGCONT            18            19      25      26
       SIGSTOP            19            17      23      24
       SIGTSTP            20            18      24      25
       SIGTTIN            21            21      26      27
       SIGTTOU            22            22      27      28
       SIGURG             23            16      21      29
       SIGXCPU            24            24      30      12
       SIGXFSZ            25            25      31      30
       SIGVTALRM          26            26      28      20
       SIGPROF            27            27      29      21
       SIGWINCH           28            28      20      23
       SIGIO              29            23      22      22
       SIGPOLL                                                 jak SIGIO
       SIGPWR             30           29/-     19      19
       SIGINFO            -            29/-     -       -
       SIGLOST            -            -/29     -       -
       SIGSYS             31            12      12      31
       SIGUNUSED          31            -       -       31

       Proszę zauważyć, co następuje:

       •  Jeśli SIGUNUSED jest zdefiniowany, to jest synonimem dla SIGSYS. Od glibc 2.26, SIGUNUSED nie jest już
          zdefiniowany na żadnej architekturze.

       •  Sygnał 29 oznacza SIGINFO/SIGPWR (synonimy o tej samej wartości) na architekturze Alpha, lecz  SIGLOST
          na architekturze SPARC.

   Sygnały czasu rzeczywistego
       Od  Linuksa  2.2,  Linux  wspiera  sygnały czasu rzeczywistego zdefiniowane pierwotnie w rozszerzeniu dla
       czasu rzeczywistego POSIX.1b (a obecnie zawarte w  POSIX.1-2001).  Zakres  obsługiwanych  sygnałów  czasu
       rzeczywistego  jest  definiowany  przez  makra SIGRTMIN i  SIGRTMAX. POSIX.1-2001 wymaga od implementacji
       wspierania co najmniej _POSIX_RTSIG_MAX (8) sygnałów czasu rzeczywistego.

       Jądro Linux wspiera 33 różne sygnały czasu rzeczywistego, o numerach od 32 do 64. Jednakże  implementacja
       wątków  POSIX  w  glibc  używa  dwóch (dla NPTL) lub trzech (dla LinuxThreads) z nich na swoje wewnętrzne
       potrzeby (patrz pthreads(7)), odpowiednio zmieniając także SIGRTMIN  (na  34  lub  35).  Ponieważ  zakres
       dostępnych  sygnałów  czasu  rzeczywistego  zmienia się zależnie od implementacji wątków w glibc (różnice
       mogą występować również w czasie działania aplikacji, zależnie od wersji jądra i glibc)  i  tak  naprawdę
       zakres  ten  różni  się  pomiędzy  implementacjami  Uniksa,  programy  nigdy nie powinny się odwoływać do
       sygnałów czasu rzeczywistego za pomocą liczb wpisanych na stałe, ale  powinny  zawsze  się  odwoływać  do
       sygnałów  czasu rzeczywistego używając notacji SIGRTMIN+n, i sprawdzać (podczas działania aplikacji), czy
       SIGRTMIN+n nie przekracza SIGRTMAX.

       W odróżnieniu od sygnałów standardowych, sygnały czasu rzeczywistego nie mają predefiniowanego znaczenia:
       można wykorzystywać cały zestaw sygnałów czasu rzeczywistego do celów określonych w aplikacji.

       Domyślną akcją na nieobsłużony sygnał czasu rzeczywistego jest przerwanie procesu, który go otrzymał.

       Sygnały czasu rzeczywistego są rozpoznawane w następujący sposób:

       •  Można kolejkować wiele egzemplarzy sygnału czasu rzeczywistego. Dla odróżnienia, jeśli  w  czasie  gdy
          standardowy  sygnał  jest  blokowany  zostanie doręczonych wiele egzemplarzy tego sygnału, tylko jeden
          egzemplarzy trafia do kolejki.

       •  Jeśli sygnał wysłano korzystając z sigqueue(3), można wysłać wraz z tym sygnałem wartość  towarzyszącą
          (całkowitą  lub  wskaźnik).  Jeśli  proces  otrzymujący  ustanawia funkcję obsługi dla tego sygnału za
          pomocą znacznika SA_SIGACTION funkcji sigaction(2), to otrzymuje towarzyszącą mu daną za pośrednictwem
          pola si_value struktury siginfo_t przekazanej jako  drugi  argument  funkcji  obsługi.  Ponadto,  pola
          si_pid  oraz  si_uid tej struktury mogą służyć do otrzymania identyfikatora procesu oraz rzeczywistego
          identyfikatora użytkownika procesu wysyłającego sygnał.

       •  Sygnały czasu rzeczywistego są doręczane w zagwarantowanej  kolejności.  Sygnały  czasu  rzeczywistego
          jednego  rodzaju  są doręczane w takiej kolejności, w jakiej zostały wysłane. Jeśli do procesu zostaną
          wysłane różne sygnały czasu rzeczywistego, będą  one  doręczone  począwszy  od  sygnału  o  najniższym
          numerze. (Tzn. sygnały o niskich numerach mają najwyższy priorytet). Sygnały standardowe zachowują się
          inaczej:  jeśli  kilka  standardowych  sygnałów oczekuje na proces, to kolejność dostarczenia nie jest
          określona.

       POSIX nie określa, które z sygnałów powinny zostać doręczone jako pierwsze  w  sytuacji,  gdy  obsłużenia
       wymagają  zarówno  sygnały  standardowe,  jak  i  sygnały  czasu rzeczywistego. Linux, podobnie do innych
       implementacji, daje w tym przypadku pierwszeństwo sygnałom standardowym.

       Zgodnie  z  POSIX,  implementacja   powinna   zezwalać   na   kolejkowanie   do   procesu   co   najmniej
       _POSIX_SIGQUEUE_MAX  (32)  sygnałów  czasu rzeczywistego. Jednakże w Linuksie zostało to zaimplementowane
       inaczej. Aż do Linuksa 2.6.7 (włącznie), Linux narzuca ogólnosystemowe ograniczenie liczby sygnałów czasu
       rzeczywistego kolejkowanych do wszystkich  procesów.  Ograniczenie  to  można  zobaczyć,  a  także  (przy
       odpowiednich  uprawnieniach)  zmienić  za  pośrednictwem  pliku  /proc/sys/kernel/rtsig-max. Podobnie, za
       pośrednictwem pliku /proc/sys/kernel/rtsig-nr można dowiedzieć się, ile sygnałów czasu rzeczywistego jest
       aktualnie  w  kolejce.  W  Linuksie  2.6.8  ten  interfejs  /proc  został  zastąpiony   limitem   zasobów
       RLIMIT_SIGPENDING,  który  określa  limit  kolejkowanych  sygnałów dla poszczególnych użytkowników; patrz
       setrlimit(2) w celu uzyskania dalszych informacji.

       Dodanie sygnałów czasu rzeczywistego wymogło poszerzenie struktury zestawu sygnałów (sigset_t) z 32 do 64
       bitów. W konsekwencji różne wywołania systemowe zostały zastąpione nowymi, które obsługują większy zestaw
       sygnałów. Oto stare i nowe wywołania systemowe:
       Linux 2.0 i wcześniejsze   Linux 2.2 i późniejsze
       sigaction(2)               rt_sigaction(2)
       sigpending(2)              rt_sigpending(2)
       sigprocmask(2)             rt_sigprocmask(2)
       sigreturn(2)               rt_sigreturn(2)
       sigsuspend(2)              rt_sigsuspend(2)
       sigtimedwait(2)            rt_sigtimedwait(2)

   Przerywanie wywołań systemowych i funkcji bibliotecznych przez funkcje obsługi sygnałów
       Jeśli procedura obsługi sygnału jest wywołana w  trakcie  wywołania  systemowego  lub  wywołania  funkcji
       bibliotecznej to wtedy albo:

       •  wywołanie jest automatycznie uruchamiane ponownie po zakończeniu funkcji obsługującej sygnał, albo

       •  wywołanie zwraca błąd EINTR.

       To,  które z powyższych wystąpi, zależy od interfejsu i od tego, czy podczas ustanawiania funkcji obsługi
       sygnału użyto znacznika  SA_RESTART (patrz sigaction(2)). Szczegóły się różnią między  różnymi  Uniksami,
       poniżej podano szczegóły dotyczące Linuksa.

       Jeśli  blokowane  wywołanie  jednego  z poniższych interfejsów zostanie przerwane przez procedurę obsługi
       sygnału, to wywołanie to zostanie automatycznie uruchomione ponownie, jeśli użyto znacznika SA_RESTART. W
       przeciwnym wypadku wywołanie zwróci błąd EINTR:

       •  Wywołania read(2), readv(2), write(2), writev(2) i ioctl(2) na  urządzeniach  „powolnych”.  Urządzenie
          „powolne”  to  takie,  w którym operacja wejścia/wyjścia może się blokować przez nieskończony czas, na
          przykład: terminal, potok  lub  gniazdo.  Jeśli  wywołanie  systemowe  wejścia/wyjścia  na  urządzeniu
          powolnym  spowodowało  już  jakiś transfer danych, zanim zostało przerwane przez sygnał, to zwróci ono
          pomyślny kod zakończenie (będący zazwyczaj liczbą przetransferowanych  bajtów).  Proszę  zauważyć,  że
          (lokalny)  dysk  zgodnie  z  tą  definicją  nie jest urządzeniem powolnym: operacje wejścia/wyjścia na
          urządzeniach dyskowych nie są przerywane sygnałami.

       •  open(2), jeśli może się zablokować (np. podczas otwierania FIFO, patrz fifo(7)).

       •  wait(2), wait3(2), wait4(2), waitid(2) i waitpid(2).

       •  Interfejsy gniazd: accept(2), connect(2),  recv(2),  recvfrom(2),  recvmmsg(2),  recvmsg(2),  send(2),
          sendto(2) i sendmsg(2), chyba że ustawiono czas przeterminowania na gnieździe (patrz niżej).

       •  Interfejsy blokady plików: flock(2) i F_SETLKW oraz operacje F_OFD_SETLKW fcntl(2)

       •  Interfejsy kolejek komunikatów POSIX: mq_receive(3), mq_timedreceive(3), mq_send(3) i mq_timedsend(3).

       •  futex(2) FUTEX_WAIT (od Linuksa 2.6.22; wcześniej zawsze zwracał błąd EINTR).

       •  getrandom(2).

       •  pthread_mutex_lock(3), pthread_cond_wait(3) i powiązane API.

       •  futex(2)  FUTEX_WAIT_BITSET.

       •  Interfejsy  semaforów  POSIX:  sem_wait(3) i sem_timedwait(3) (od Linuksa 2.6.22;  wcześniejsze wersje
          zawsze zwracały błąd EINTR).

       •  read(2) z deskryptora pliku inotify(7) (od Linuksa 3.8; wcześniej zawsze zwracało błąd EINTR).

       Następujące interfejsy nigdy nie są wznawiane po przerwaniu przez funkcję obsługi sygnału, niezależnie od
       tego, czy SA_RESTART zostało użyte. Jeśli zostaną przerwane przez  funkcję  obsługi  sygnału,  to  zawsze
       kończą się niepowodzeniem, zwracając błąd EINTR:

       •  „Wejściowe”  interfejsy  gniazd, jeśli ustawiono czas przeterminowania gniazda (SO_RCVTIMEO) za pomocą
          setsockopt(2): accept(2), recv(2), recvfrom(2), recvmmsg(2)  (również z niezerowym argumentem timeout)
          i recvmsg(2).

       •  „Wyjściowe” interfejsy gniazd, jeśli ustawiono czas przeterminowania gniazda (SO_RCVTIMEO)  za  pomocą
          setsockopt(2): connect(2), send(2), sendto(2) i sendmsg(2).

       •  Interfejsy oczekiwania na sygnały: pause(2), sigsuspend(2), sigtimedwait(2) i sigwaitinfo(2).

       •  Interfejsy  zwielokrotniające  deskryptory  plików:  epoll_wait(2), epoll_pwait(2), poll(2), ppoll(2),
          select(2) i pselect(2).

       •  Interfejsy komunikacji międzyprocesowej Systemu V: msgrcv(2), msgsnd(2), semop(2) oraz semtimedop(2).

       •  Interfejsy pauzujące proces: clock_nanosleep(2), nanosleep(2) i usleep(3).

       •  io_getevents(2).

       Funkcja sleep(3) nigdy nie zostanie  zrestartowana  po  przerwaniu  przez  sygnał  i  zawsze  kończy  się
       pomyślnie, zwracając liczbę pozostałych sekund, podczas których proces powinien był pauzować.

       W  pewnych  okolicznościach,  funkcji  powiadomień  w przestrzeni użytkownika seccomp(2), może spowodować
       ponowne uruchomienia wywołań systemowych, które w innych przypadkach nigdy  nie  zostałyby  zrestartowane
       przez SA_RESTART; więcej szczegółów w podręczniku seccomp_unotify(2).

   Przerywanie wywołań systemowych i funkcji bibliotecznych przez sygnały zatrzymujące proces
       Pod  Linuksem,  nawet  jeśli  procedury obsługi sygnału nie zostaną ustawione, pewne interfejsy blokujące
       mogą się zakończyć niepowodzeniem i zwrócić błąd EINTR po tym, jak proces zostanie zatrzymany  za  pomocą
       jednego  z sygnałów zatrzymujących (takich jak SIGSTOP), a następnie wznowiony za pomocą SIGCONT. POSIX.1
       nie wspiera tego zachowania, nie występuje ono także na innych systemach.

       Następujące interfejsy Linuksa zachowują się w ten sposób:

       •  „Wejściowe” interfejsy gniazd, jeśli ustawiono czas przeterminowania gniazda (SO_RCVTIMEO)  za  pomocą
          setsockopt(2): accept(2), recv(2), recvfrom(2), recvmmsg(2)  (również z niezerowym argumentem timeout)
          i recvmsg(2).

       •  „Wyjściowe”  interfejsy  gniazd, jeśli ustawiono czas przeterminowania gniazda (SO_RCVTIMEO) za pomocą
          setsockopt(2): connect(2), send(2), sendto(2) i  sendmsg(2),  jeśli  ustawiono  czas  przeterminowania
          wysyłania danych(SO_SNDTIMEO).

       •  epoll_wait(2), epoll_pwait(2).

       •  semop(2), semtimedop(2).

       •  sigtimedwait(2), sigwaitinfo(2).

       •  Linux 3.7 i wcześniejsze: read(2) czytające z deskryptora pliku inotify(7).

       •  Linux 2.6.21 i wcześniejsze: futex(2)  FUTEX_WAIT, sem_timedwait(3), sem_wait(3).

       •  Linux 2.6.8 i wcześniejsze: msgrcv(2), msgsnd(2).

       •  Linux 2.4 i wcześniejsze: nanosleep(2).

STANDARDY

       POSIX.1, z wyjątkami jak podano.

UWAGI

       Opis funkcji async-signal-safe znajduje się w podręczniku signal-safety(7).

       Plik  /proc/pid/task/tid/status  zawiera  różne  pola,  które  pokazują  sygnały,  które  sygnał: blokuje
       (SigBlk), przechwytuje (SigCgt) lub ignoruje (SigIgn) (przy  czym  zbiór  sygnałów  przechwytywanych  lub
       ignorowanych jest taki sam dla wszystkich wątków procesu). Inne pola ukazują zbiór sygnałów oczekujących,
       które  są  skierowane  do  wątku (SigPnd) oraz zbiór sygnałów oczekujących, które są skierowane do całego
       procesu (ShdPnd). Odpowiadające im pola w /proc/pid/status pokazują informacje dla głównego wątku. Więcej
       szczegółów w podręczniku proc(5).

USTERKI

       Istnieje sześć sygnałów, które mogą być dostarczone z powodu wyjątku sprzętowego: SIGBUS, SIGEMT, SIGFPE,
       SIGILL, SIGSEGV i SIGTRAP. To, które z nich są dostarczane dla  jakiegoś  wyjątku  sprzętowego  nie  jest
       udokumentowane i nie zawsze ma sens.

       Przykładowo,  nieprawidłowy  dostęp  do  pamięci,  który  powoduje dostarczenie sygnału SIGSEGV na jednej
       architekturze procesora, może powodować dostarczanie sygnału SIGBUS na innej architekturze lub odwrotnie.

       Innym przykładem jest instrukcja int x86 z zabronionym argumentem (liczbą inną  niż  3  lub  128),  która
       powoduje  dostarczenie  SIGSEGV,  choć logiczniejszy, z powodu sposobu, w jaki procesor informuje jądro o
       zabronionych operacjach, byłby sygnał SIGILL.

ZOBACZ TAKŻE

       kill(1), clone(2), getrlimit(2), kill(2), pidfd_send_signal(2),  restart_syscall(2),  rt_sigqueueinfo(2),
       setitimer(2),   setrlimit(2),   sgetmask(2),   sigaction(2),   sigaltstack(2),   signal(2),  signalfd(2),
       sigpending(2), sigprocmask(2),  sigreturn(2),  sigsuspend(2),  sigwaitinfo(2),  abort(3),  bsd_signal(3),
       killpg(3),  longjmp(3),  pthread_sigqueue(3),  raise(3), sigqueue(3), sigset(3), sigsetops(3), sigvec(3),
       sigwait(3),  strsignal(3),  swapcontext(3),  sysv_signal(3),  core(5),  proc(5),  nptl(7),   pthreads(7),
       sigevent(3type)

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej  strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>,
       Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje  o  warunkach  licencji  można  uzyskać
       zapoznając   się   z   GNU General Public License w wersji 3   lub  nowszej.  Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej  manpages-pl-
       list@lists.sourceforge.net.

Linux man-pages 6.8                              2 maja 2024 r.                                        signal(7)