kill(2) System Calls Manual kill(2) NAZWA kill - wysyla sygnal do procesu BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include 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() moze sluzyc do przeslania dowolnego sygnalu do dowolnego procesu lub do dowolnej grupy procesow. Jesli pid ma wartosc dodatnia, to sygnal sig jest przesylany do procesu o identyfikatorze pid. Jesli pid jest rowny 0, to sig jest przesylany do wszystkich procesow nalezacych do tej samej grupy, co proces wywolujacy. Jesli pid jest rowny -1, to sygnal jest przesylany do wszystkich procesow, do ktorych proces wywolujacy ma prawo wysylac sygnaly, oprocz procesu nr 1 (init), szczegoly ponizej. Jesli pid jest mniejszy niz -1, to sygnal jest przesylany do wszystkich procesow nalezacych do grupy procesow o identyfikatorze rownym -pid. Jesli sig jest rowny 0, to nie jest wysylany zaden sygnal, ale wciaz przeprowadzane jest sprawdzenie istnienia i uprawnien; mozna to wykorzystac w celu sprawdzenia istnienia identyfikatora procesu lub identyfikatora grupy procesu, w przypadku ktorych wywolujacy ma prawo wysylac sygnaly. Aby proces mial prawo wyslac sygnal, musi byc albo uprzywilejowany (w Linuksie: posiadac przywilej CAP_KILL (ang. capability) w przestrzeni nazw uzytkownika procesu docelowego), albo rzeczywisty lub efektywny identyfikator uzytkownika procesu wysylajacego musi byc rowny rzeczywistemu ID lub zachowanemu set UID procesu docelowego. W przypadku sygnalu SIGCONT wystarcza, aby procesy wysylajacy i otrzymujacy nalezaly do tej samej sesji (historycznie zasady te byly inne; zob. UWAGI). WARTOSC ZWRACANA Po pomyslnym zakonczeniu (gdy wyslano co najmniej jeden sygnal) zwracane jest zero. w przypadku bledu zwracane jest -1 i ustawiane errno wskazujac blad. BLEDY EINVAL Podano nieprawidlowy sygnal. EPERM Proces wywolujacy nie ma uprawnien do wysylania sygnalu do zadnego z procesow docelowych. ESRCH Docelowy proces lub grupa procesow nie istnieje. Nalezy zauwazyc, ze istniejacy proces moze byc zombie, czyli procesem, ktory juz zakonczyl wykonanie, lecz jeszcze na niego nie zaczekano (wait(2)). STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4, 4.3BSD. Uwagi linuksowe W roznych wersjach jadra, Linux wymusza rozne reguly dotyczace uprawnien wymaganych od procesu nieuprzywilejowanego, aby mogl on wyslac sygnal do innego procesu. W Linuksie 1.0 do 1.2.2 sygnal mogl byc wyslany, gdy efektywny identyfikator uzytkownika wysylajacego jest taki sam, jak odbierajacego, lub gdy rzeczywisty identyfikator uzytkownika wysylajacego jest taki sam, jak odbierajacego. Od Linuksa 1.2.3 az do 1.3.77, sygnal mogl byc wyslany, gdy efektywny identyfikator uzytkownika wysylajacego jest taki sam, jak efektywny lub rzeczywisty identyfikator uzytkownika odbierajacego. Obecne zasady, zgodnie z POSIX.1, zostaly przyjete w Linuksie 1.3.78. UWAGI Jedyne sygnaly, jakie mozna wyslac do procesu o identyfikatorze 1 -- procesu init -- to te, dla ktorych init jawnie zainstalowal procedure obslugi sygnalu. Zabezpiecza to przed przypadkowym zalamaniem systemu. POSIX.1 wymaga, aby kill(-1,sig) wysylalo sig do wszystkich procesow, do ktorych aktualny proces moze go wyslac, za ewentualnym wyjatkiem pewnych, zdefiniowanych w implementacji, procesow systemowych. Linux pozwala procesowi wyslac sygnal do samego siebie, ale wywolanie kill(-1,sig) pod Linuksem nie powoduje wyslania sygnalu do procesu wywolujacego. W przypadku gdy proces wysyla sygnal do siebie samego, a wysylajacy watek nie blokuje sygnalu i zaden inny watek go nie odblokowal, ani nie czeka na niego w sigwait(3), POSIX.1 wymaga, aby co najmniej jeden odblokowany sygnal zostal dostarczony do wysylajacego watku przed powrotem kill(). USTERKI W Linuksie 2.6 do Linuksa 2.6.7 wlacznie istnial blad, ktory w przypadku wysylania sygnalow do grupy procesu powodowal, ze kill() zawodzilo z bledem EPERM, gdy wywolujacy nie mial uprawnien do wysylania sygnalu do ktoregokolwiek (zamiast, poprawnie, wszystkich) czlonkow grupy procesu. Pomimo zwracanego bledu, sygnal docieral jednak do wszystkich procesow, do ktorych wywolujacy mial prawo wysylac sygnaly. ZOBACZ TAKZE kill(1), _exit(2), pidfd_send_signal(2), signal(2), tkill(2), exit(3), killpg(3), sigqueue(3), capabilities(7), credentials(7), signal(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 2 maja 2024 r. kill(2)