kill(2)

NAZWA
kill - wysyła sygnał do procesu

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <signal.h>

int kill(pid_t pid, int sig);

    Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

kill():
    _POSIX_C_SOURCE

OPIS
Funkcja systemowa kill() może służyć do przesłania dowolnego sygnału do dowolnego procesu lub do dowolnej grupy procesów.

Jeśli pid ma wartość dodatnią, to sygnał sig jest przesyłany do procesu o identyfikatorze pid.

Jeśli pid jest równy 0, to sig jest przesyłany do wszystkich procesów należących do tej samej grupy, co proces wywołujący.

Jeśli pid jest równy -1, to sygnał jest przesyłany do wszystkich procesów, do których proces wywołujący ma prawo wysyłać sygnały, oprócz procesu nr 1 (init), szczegóły poniżej.

Jeśli pid jest mniejszy niż -1, to sygnał jest przesyłany do wszystkich procesów należących do grupy procesów o identyfikatorze równym -pid.

Jeśli sig jest równy 0, to nie jest wysyłany żaden sygnał, ale wciąż przeprowadzane jest sprawdzenie istnienia i uprawnień; można to wykorzystać w celu sprawdzenia istnienia identyfikatora procesu lub identyfikatora grupy procesu, w przypadku których wywołujący ma prawo wysyłać sygnały.

Aby proces miał prawo wysłać sygnał, musi być albo uprzywilejowany (w Linuksie: posiadać przywilej CAP_KILL (ang. capability) w przestrzeni nazw użytkownika procesu docelowego), albo rzeczywisty lub efektywny identyfikator użytkownika procesu wysyłającego musi być równy rzeczywistemu ID lub zachowanemu set UID procesu docelowego. W przypadku sygnału SIGCONT wystarcza, aby procesy wysyłający i otrzymujący należały do tej samej sesji (historycznie zasady te były inne; zob. HISTORIA).

WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu zwracane jest zero. Jeśli sygnał był wysyłany do grupy procesów, sukcesem jest dostarczenie co najmniej jednego. W przypadku błędu zwracane jest -1 i ustawiane errno wskazując błąd.

BŁĘDY

EINVAL
    Podano nieprawidłowy sygnał.

EPERM
    Proces wywołujący nie ma uprawnień do wysyłania sygnału do żadnego z procesów docelowych.

ESRCH
    Docelowy proces lub grupa procesów nie istnieje. Należy zauważyć, że istniejący proces może być zombie, czyli procesem, który już zakończył wykonanie, lecz jeszcze na niego nie zaczekano (wait(2)).

STANDARDY
POSIX.1-2024.

HISTORIA
4.3BSD, SVr4, POSIX.1-1988.

  Uwagi linuksowe
W różnych wersjach jądra, Linux wymusza różne reguły dotyczące uprawnień wymaganych od procesu nieuprzywilejowanego, aby mógł on wysłać sygnał do innego procesu. W Linuksie 1.0 do 1.2.2 sygnał mógł być wysłany, gdy efektywny identyfikator użytkownika wysyłającego jest taki sam, jak odbierającego, lub gdy rzeczywisty identyfikator użytkownika wysyłającego jest taki sam, jak odbierającego. Od Linuksa 1.2.3 aż do 1.3.77, sygnał mógł być wysłany, gdy efektywny identyfikator użytkownika wysyłającego jest taki sam, jak efektywny lub rzeczywisty identyfikator użytkownika odbierającego. Obecne zasady, zgodnie z POSIX.1, zostały przyjęte w Linuksie 1.3.78.

UWAGI
Jedyne sygnały, jakie można wysłać do procesu o identyfikatorze 1 — procesu init — to te, dla których init jawnie zainstalował procedurę obsługi sygnału. Zabezpiecza to przed przypadkowym załamaniem systemu.

POSIX.1 wymaga, aby kill(-1,sig) wysyłało sig do wszystkich procesów, do których aktualny proces może go wysłać, za ewentualnym wyjątkiem pewnych, zdefiniowanych w implementacji, procesów systemowych. Linux pozwala procesowi wysłać sygnał do samego siebie, ale wywołanie kill(-1,sig) pod Linuksem nie powoduje wysłania sygnału do procesu wywołującego.

W przypadku gdy proces wysyła sygnał do siebie samego, a wysyłający wątek nie blokuje sygnału i żaden inny wątek go nie odblokował, ani nie czeka na niego w sigwait(3), POSIX.1 wymaga, aby co najmniej jeden odblokowany sygnał został dostarczony do wysyłającego wątku przed powrotem kill().

USTERKI
W Linuksie 2.6 do Linuksa 2.6.7 włącznie istniał błąd, który w przypadku wysyłania sygnałów do grupy procesu powodował, że kill() zawodziło z błędem EPERM, gdy wywołujący nie miał uprawnień do wysyłania sygnału do któregokolwiek (zamiast, poprawnie, wszystkich) członków grupy procesu. Pomimo zwracanego błędu, sygnał docierał jednak do wszystkich procesów, do których wywołujący miał prawo wysyłać sygnały.

ZOBACZ TAKŻE
kill(1), _exit(2), pidfd_send_signal(2), signal(2), tkill(2), exit(3), killpg(3), sigqueue(3), capabilities(7), credentials(7), signal(7)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> 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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.