NAME

kill - 프로세스에게 시그널 보내기

SYNOPSIS

#include <signal.h>

int kill(pid_t pid, int sig);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

kill():
_POSIX_C_SOURCE

DESCRIPTION

kill() 시스템 호출을 사용해 임의의 프로세스 그룹 내지 프로세스에게 임의의 시그널을 보낼 수 있다.

pid가 양수이면 pid로 지정한 ID의 프로세스에게 시그널 sig를 보낸다.

pid가 0이면 호출 프로세스의 프로세스 그룹 내의 모든 프로세스에게 sig를 보낸다.

pid가 -1이면 프로세스 1(init)을 제외하고 호출 프로세스가 시그널을 보낼 권한을 가진 모든 프로세스에게 sig를 보낸다. 단 아래 있는 내용을 보라.

pid가 -1보다 작으면 ID가 -pid인 프로세스 그룹 내의 모든 프로세스에게 sig를 보낸다.

sig가 0이면 어떤 시그널도 보내지 않되, 존재 및 권한 검사는 마찬가지로 수행한다. 호출자가 시그널을 보낼 수 있는 프로세스 ID 내지 프로세스 그룹 ID의 존재를 확인하는 데 이용할 수 있다.

프로세스가 시그널을 보낼 권한이 있으려면 특권이 있거나 (리눅스에서: 대상 프로세스의 사용자 네임스페이스에서 CAP_KILL 역능을 가지고 있거나), 보내는 프로세스의 실제 사용자 ID나 실효 사용자 ID가 대상 프로세스의 실제 사용자 ID나 저장된 set-user-ID와 같아야 한다. SIGCONT에서는 송신 프로세스와 수신 프로세스가 같은 세션에 속하는 것으로 충분하다. (역사적으로는 그 규칙이 달랐다. NOTES 참고.)

RETURN VALUE

성공 시 (시그널을 최소 하나 보냈으면) 0을 반환한다. 오류 시 -1을 반환하며 오류를 나타내도록 errno를 설정한다.

ERRORS

EINVAL
유효하지 않은 시그널을 지정했다.
EPERM
호출 프로세스에게 대상 프로세스들 중 어느 것에도 시그널을 보낼 권한이 없다.
ESRCH
대상 프로세스 내지 프로세스 그룹이 존재하지 않는다. 참고로 존재하는 프로세스가 실행을 마쳤지만 아직 wait(2) 되지 않은 좀비일 수도 있다.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

NOTES

프로세스 ID가 1인 init 프로세스에게는 init에서 명시적으로 시그널 핸들러를 설치한 시그널들만 보낼 수 있다. 의도치 않게 시스템을 내리는 일이 없도록 하기 위해서이다.

POSIX.1에서는 kill(-1,sig)라고 하면 구현에서 정의하는 일부 시스템 프로세스들을 제외하고 호출 프로세스가 시그널을 보낼 수 있는 모든 프로세스들에게 sig를 보내기를 요구한다. 리눅스에서는 프로세스가 스스로에게 시그널을 보낼 수 있지만 kill(-1,sig) 호출은 호출 프로세스에게 시그널을 보내지 않는다.

POSIX.1에서는 프로세스가 스스로에게 시그널을 보내는데 송신 스레드가 그 시그널을 막고 있지 않고, 다른 어떤 스레드도 그 시그널을 비차단으로 두거나 sigwait(3)에서 기다리고 있지 않으면 kill()이 반환하기 전에 송신 스레드에게 최소 한 개의 비차단 시그널이 전달되어야 한다고 요구한다.

리눅스 참고 사항

다양한 커널 버전들에 걸쳐 리눅스에서는 비특권 프로세스가 다른 프로세스에게 시그널을 보내기 위해 필요한 권한에 있어 상이한 규칙들을 적용해 왔다. 커널 1.0에서 1.2.2까지는 송신자의 실효 사용자 ID가 대상의 실효 사용자 ID와 일치하거나 송신자의 실제 사용자 ID가 대상의 실제 사용자 ID와 일치하면 시그널을 보낼 수 있었다. 커널 1.2.3에서 1.3.77까지는 송신자의 실효 사용자 ID가 대상의 실제 사용자 ID와 실효 사용자 ID 중 한쪽과 일치하면 시그널을 보낼 수 있었다. 커널 1.3.78에서 POSIX.1을 준수하는 현행 규칙을 채택했다.

BUGS

2.6.7까지의 2.6 커널들에는 프로세스 그룹에게 시그널을 보낼 때 호출자가 그 프로세스 그룹의 (전체가 아니라) 아무 구성원에게라도 시그널을 보낼 권한이 없으면 EPERM 오류로 kill()이 실패하는 버그가 있었다. 이 오류 반환에도 불구하고 호출자가 시그널을 보낼 권한이 있는 모든 프로세스에게 시그널이 전달되기는 했다.

SEE ALSO

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


2021-03-22