보통 kill 함수를 통해 특정 프로세스에 원하는 시그널을 보낸다.
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에는 전달되지 않아
프로세스가 살아있는 모습이다.