시스템 프로그래밍

Sending Signal to Specific PID Using Kill Function

swc0317 2024. 8. 9. 02:34
728x90
반응형

 

보통 kill 함수를 통해 특정 프로세스에 원하는 시그널을 보낸다.

 

kill function

 

kill

The following sections are informative. The semantics for permission checking for kill() differed between System V and most other implementations, such as Version 7 or 4.3 BSD. The semantics chosen for this volume of IEEE Std 1003.1-2001 agree with Syste

pubs.opengroup.org

 

 

근데 PID를 특정하고 시그널을 보내도 이상하게 fork()로 생성된 

 

자식 프로세스들 모두에 시그널이 전달된다.

 

 

쉘의 execve 함수를 통해 프로세스 내부에서 프로그램을 실행한다.

 

한 프로그램은 BACKGROUND에서 (./myspin 30 &)

 

다른 프로그램은 FOREGROUND에서 실행한다. (./myspin 30)

 

이후 Ctrl + C를 통해 SIGINT를 전달하면 핸들러를 통해 분명히

 

FOREGROUND JOB이 존재할 경우, 해당 PID에만

 

특정하여 시그널을 전달했으나 전부 SIGINT가 전달되는 모습이다.

 

 

심지어 저 주석을 떼고, FOREGROUND JOB이 없을 때 0을 return하는

 

fgpid 함수의 0을 받아 

 

NO FG JOBS 가 출력되도 모든 프로세스에

 

SIGINT가 전달되는 모습을 보인다.

 

 

왜 그런가 봤더니, kill 함수는 분명 특정 PID에만

 

시그널을 전달하긴 한다. 그러나 해당 PID에 전달한 이후

 

해당 PID가 속한 GPID에 모두 전달하는 것.

 

 

위 그림은 myspin 프로그램 코드이다.

 

SIGINT handler에 PGID를 출력하는 함수를 넣어주고 돌려보자.

 

 

보면 PGID가 같다.

 

그러니까, 쉘을 통해 다른 프로그램을 구동하는 프로그램을

 

구현할 때, 시그널을 PID에 Specific하게 전달하고 싶으면

 

Group을 구분하자.

 

 

이를 통해 각각의 Process들은 각자의 PID와 같은 PGID를 가진다.

 

 

보면 BACKGROUND 프로세스와 FOREGROUND 프로세스

 

둘을 구동시키고, SIGINT를 전달해도 시그널 핸들러를 통해

 

FOREGROUND job에만 Specific하게 전달되고

 

PGID가 다른 BACKGROUND job에는 전달되지 않아

 

프로세스가 살아있는 모습이다.

728x90
반응형