설명

kill() 함수는 쉘에서 프로세스를 죽이는 kill 명령과는 달리 프로세스에 시그널을 전송합니다. 물론 프로세스에 SIGKILL을 보내면 쉘 명령의 kill 과 같은 역활을 합니다.

kill() 함수는 특정 프로세스 뿐만 아니라 같은 그룹 ID가 같은 모든 프로세스에게 동시에 시그널을 전송할 수 있으며, 권한 안에 있는 모든 프로세스에게도 시그널을 전송할 수 있습니다.

함수의 형태부터 보시죠.

int kill(pid_t pid, int sig);

두 번째 인수, sig는 시그널 번호입니다. 첫번째는 프로세스 ID이구요. 이 프로세스 ID 값에 따라 아래와 같이 처리가 분류됩니다.

pid 의미
양의 정수 지정한 프로세스 ID에만 시그널을 전송
0 함수를 호출하는 프로세스와 같은 그룹에 있는 모든 프로세스에 시그널을 전송
-1 함수를 호출하는 프로세스가 전송할 수 있는 권한을 가진 모든 프로세스에 시그널을 전송
-1 이와의 음수 첫번째 인수 pid 의 절대값 프로세스 그룹에 속하는 모든 프로세스에 시그널을 전송

 

헤더 signal.h
형태 int kill(pid_t pid, int sig);
인수
pid_t pid 시그널을 받을 프로세스 ID
int sig 시그널 번호
반환
0 성공
-1 실패

예제

예제에서는 쉘 명령인 kill과 같은 프로그램을 만들어 보도록 하겠습니다. 즉, 인수로 받은 첫번째 값을 pid 로 해서 SIGKILL 시그널을 전송하는 것이죠.

#include <stdio.h>
#include <signal.h>

int main( int argc, char *argv[])
{
   if ( argc < 2)
   {
      printf( "사용법: ./a.out [프로세스 ID]\n");
   }
   else
   {
      kill( atoi( argv[1]), SIGKILL);
   }
}

프로그램 파일을 main.c 로 저장했습니다. 그리고 실행파일을 my_kill로 컴파일합니다.

]$ gcc main.c -o my_kill
]$

프로그램을 테스트하기 위해 무한으로 실행되는 test.c 를 아래와 같이 작성했습니다.

그래서 아래와 같은 프로그램을 작성해 보았습니다.

#include <stdio.h>
#include <unistd.h>

int main( void)
{
   while( 1 )
   {
      printf( "forum.falinux.com\n");
      sleep( 3);
   }
   return 0;
}

그리고 test.c 를 test 라는 이름으로 컴파일하고 실행합니다.

]$ gcc test.c -o test
]$ ./test &

[1] 10009     <- test의 pid
]$ forum.falinux.com
forum.falinux.com
forum.falinux.com
./my_kill 10009   <- test의 pid로 SIGKILL 전송
[1]+  죽었음                  ./test
]$