출처 : http://forum.falinux.com/zbxe/?mid=C_LIB&page=2&document_srl=413771
설명
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 | 시그널 번호 |
|
반환 | |
예제
예제에서는 쉘 명령인 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
]$