KILL(2)

이름
kill - 프로세스에게 시그널을 보낸다.

사용법
#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);

설명
kill 시스템 콜은 어떤 프로세스 그룹이나 프로세스에 시그널을 보낼 때 사용될 수 있다.

pid가 양수이면, sig 시그널은 pid로 보내진다.

pid가 0이면, sig는 현재 프로세스가 속한 프로세스 그룹의 모든 프로세스에 보내진다.

pid가 -1이면, sig는 1번 프로세스를 제외한 모든 프로세스에게 큰 번호의 프로세스에서 작은 번호 순으로 보내진다.

pid가 -1보다 작으면, sig는 -pid 프로세스 그룹의 모든 프로세스에 보내진다.

sig가 0이면, 어떤 시그널도 보내지지는 않지만, 에러 검사는 행해진다.

반환값
성공시, 0이 리턴된다. 에러시, -1이 리턴되고 errno가 적절히 설정된다.

에러

EINVAL
    잘못된 시그널이 지정되었다.

ESRCH
    프로세스나 프로세스 그룹이 존재하지 않는다. 존재하는 프로세스이지만 좀비(zombie)일 수도 있음에 주의하라. 좀비는 이미 종료했지만 아직 wait() 처리되지 않은 프로세스이다.

EPERM
    시그널을 받는 프로세스중 어떤 프로세스에게 시그널을 보낼 권한이 없다. 프로세스가 pid 프로세스에 시그널을 보낼 권한을 가지려면 루트 권한을 가지거나, 보내는 프로세스의 실(real) 사용자 ID나 유효(effective) 사용자 ID가 받는 프로세스의 실 사용자 ID나 저장된 set-user-ID와 같아야만 한다. SIGCONT인 경우에는 보내는 프로세스와 받는 프로세스가 같은 세션에 속해 있는 상황을 만족시킨다.

주의
1번 태스크인 init 프로세스에게 시그널을 보낼 수 없다. 따라서 init 프로세스는 시그널 핸들러를 가질 수 없다. 이는 시스템이 사고로 다운되지 않게 하기 위해서 이다. POSIX 1003.1-2001의 규정에 의하면 kill(-t,sig) 는 sig 를 모든 프로세스에 보내는 것이다. 이때 발생될 수 있는 어떤 구현-정의된(implementation-defined) 시스템 프로세스는 제외될 수 있다. 리눅스는 시그널 그 자체에 대한 프로세스가 가능하지만 리눅스 상에서 kill(-t,sig)를 호출하는 것으로 현재 프로세스에 시그널을 보낼 수는 없다.

리눅스 역사
하나의 권한 없는 프로세스가 또 다른 프로세스에 시그널을 보내는 것에 대한 허용권한에 대해 서로 다른 리눅스 커널 버젼에 간에 서로 다른 규칙을 갖는다. 커널 1.0 에서 1.2.2 에서는 만약 받는 프로세스의 유효 사용자 ID가 보내는 프로세스의 유효 사용자 ID와 서로 부합(matched)하거나, 받는 프로세스의 실제(real) 사용자 ID가 보내는 프로세스의 실제 사용자 ID와 서로 부합할때 시그널이 보내질 수 있다. 커널 1.2.3 에서 1.3.77 에서는 받는 프로세스의 유효 사용자 ID가 보내는 프로세스의 실제 또는 유효 사용자 ID와 부합(match)할 때 시그널이 보내질 수 있다. POSIX 1003.1-2001에서 인증된 현재의 규칙은 커널 1.3.78에서 채용되었다.

호환
SVr4, SVID, POSIX.1, X/OPEN, BSD 4.3, POSIX 1003.1-2001

관련 항목
_exit(2), _killpg(2) signal(2), tkill(2), exit(3), signal(7)

번역
임종균 <hermes44@secsm.org> 2000년 4월 20일
한우섭 <wshan@samsung.com> 2004년 6월 3일
한글 Manpage 프로젝트 (http://man.kldp.org) 2005년 2월 17일