Signal: 두 판 사이의 차이
편집 요약 없음 |
편집 요약 없음 |
||
| 64번째 줄: | 64번째 줄: | ||
==Sending Signal== | ==Sending Signal== | ||
===Process Group=== | ===Process Group=== | ||
모든 프로세스는 단 하나의 process | [[파일:ProcessGroup.png|섬네일|400x400픽셀|Process group example]] | ||
모든 프로세스는 단 하나의 process group(프로세스 그룹)에 속한다. 이 그룹은 양의 정수인 process group ID로 식별된다. 현재 프로세스의 process group ID를 알기 위해서는 이를 반환하는 getpgrp()함수를 사용할 수 있다. | |||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
#include <unistd.h> | #include <unistd.h> | ||
pid_t getpgrp(void); | pid_t getpgrp(void); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
기본적으로 child process는 parent process와 동일한 | 기본적으로 child process는 parent process와 동일한 프로세스 그룹에 속한다. 이때 프로세스는 setpgid() 함수를 사용하여 자신이나 다른 프로세스의 프로세스 그룹을 변경할 수 있다. | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
#include <unistd.h> | #include <unistd.h> | ||
int setpgid(pid_t pid, pid_t pgid); | int setpgid(pid_t pid, pid_t pgid); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
setpgid 함수는 프로세스 pid의 | setpgid 함수는 프로세스 pid의 프로세스 그룹의 ID를 pgid로 변경한다. 만약 pid가 0이면, 현재 프로세스의 PID가 사용된다. pgid가 0이면, pid로 지정된 프로세스의 PID가 프로세스 그룹 ID로 사용됩니다. 다음은 PID가 15213인 프로세스에서 setpgid()함수를 호출한 예시이다. | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
setpgid(0, 0); | setpgid(0, 0); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
위 함수의 실행은 process group ID가 15213인 | 위 함수의 실행은 process group ID가 15213인 프로세스 그룹이 이미 존재한다면 PID가 15213인 프로세스를 해당 그룹에 추가한다. 만약 process group ID가 15213인 프로세스 그룹이 존재하지 않는다면 그러한 프로세스 그룹을 만들고 ID가 15213인 프로세스를 해당 그룹에 추가한다. | ||
===/Bin/kill 프로그램을 사용한 신호 보내기=== | |||
/bin/kill 프로그램은 다른 프로세스나 프로세스 그룹에 임의의 신호를 보낸다. 예를 들어, | |||
<syntaxhighlight lang="c"> | |||
linux> /bin/kill -9 15213 | |||
</syntaxhighlight> | |||
위 명령은 process 15213에 signal -9(SIGKILL)을 보낸다. 이때 PID로 음수를 사용하면 해당 process group 15213에 존재하는 모든 프로세스에 해당 signal을 보낸다. 예를 들어, | |||
<syntaxhighlight lang="c"> | |||
linux> /bin/kill -9 -15213 | |||
</syntaxhighlight> | |||
위 명령은 process group 15213에 있는 모든 프로세스에 SIGKILL 신호를 보낸다. | |||
==각주== | ==각주== | ||
[[분류:컴퓨터 네트워크]] | [[분류:컴퓨터 네트워크]] | ||
2025년 3월 18일 (화) 15:50 판
상위 문서: Signals and Nonlocal jumps
개요
signal이란 시스템에서 어떤 종류의 이벤트가 발생했음을 프로세스에 알리는 작은 메시지이다. signal은 이를 위해서 kernel에서 process로 보내지며, signal type은 1~30의 정수로 식별된다. 이때 어떤 signal에 저장된 정보는 해당 ID와 그 signal이 도착했다는 사실 뿐이다. 아래는 몇가지 signal ID와 그에 대응되는 signal들을 나타낸 표이다.
| ID | Name | Default Action | Corresponding Event |
|---|---|---|---|
| 2 | SIGINT | Terminate | User typed ctrl-c |
| 9 | SIGKILL | Terminate | Kill program(cannot override or ignore) |
| 11 | SIGSEGV | Terminate | Segmentation violation |
| 14 | SIGALRM | Terminate | Timer Signal |
| 17 | SIGCHLD | Ignore | Child stopped or terminated |
Signal Concepts

시그널이 대상 프로세스로 전달되는 과정은 다음 두 가지의 명확한 단계로 이루어진다.
- Sending a signal
- 커널은 destination 프로세스의 context 일부 상태를 업데이트해 해당 프로세스에 시그널을 보낸다. 다음은 signal이 전달되는 경우이다.
- 커널이 0으로 나누기 오류나 자식 프로세스의 종료와 같은 시스템 이벤트를 감지했을 때
- 한 프로세스가 kill 함수를 호출하여 명시적으로 커널에게 대상 프로세스에 signal을 보내도록 요청했을 때
- 프로세스는 자기 자신에게 시그널을 보낼 수도 있다.
- 커널은 destination 프로세스의 context 일부 상태를 업데이트해 해당 프로세스에 시그널을 보낸다. 다음은 signal이 전달되는 경우이다.
- Receiving a signal
- destination 프로세스는 커널이 해당 시그널의 전달에 반응하도록 강제할 때 시그널을 받는다. 프로세스는 시그널에 대해 다음 세 가지 중 하나의 반응을 할 수 있다:
- signal을 무시(Ignore)
- 프로세스를 종료(Terminate)
- 사용자 수준 함수인 signal handler을 실행하여 시그널을 catch하여 처리
- destination 프로세스는 커널이 해당 시그널의 전달에 반응하도록 강제할 때 시그널을 받는다. 프로세스는 시그널에 대해 다음 세 가지 중 하나의 반응을 할 수 있다:
- Pending and Blocked Signal
- Pending signal은 전송되었지만 수신이 완료되지 않은 signal을 의미한다.
- 특정한 유형의 pending signal은 최대 하나만 존재할 수 있다. 만약 프로세스가 특정 유형(k)의 pending signal을 가지고 있다면, 그 프로세스에 대해 이후에 보내지는 동일한 유형(k)의 signal는 대기열에 쌓이지 않고 단순히 버려진다.
- 프로세스는 특정한 유형의 signal 수신을 block할 수 있다.
- 이때 signal이 전달될 수는 있으나, 해당 signal은 pending signal이 되어 프로세스가 해당 유형의 signal을 unblock하기 전까지는 수신되지 않는다.
- 커널은 각 프로세스의 context에서 pending signal과 blocked signal에 대한 bit vector를 가지고 있다.
- pending: pending signal들의 집합을 나타내는 bit vector이다.
- 커널은 유형이 k인 signal이 전달되면 pending vector에 k bit를 설정한다.
- 커널은 유형이 k인 signal이 수신되면 pending vector에서 k bit를 지운다.
- blocked: block된 signal들의 집합을 나타내는 bit vector이다.
- signal mask라고도 불린다.
- sigprocmask 함수를 통해서 특정 유형의 signal을 block하거나 unblock할 수 있다.
- pending: pending signal들의 집합을 나타내는 bit vector이다.
- Pending signal은 전송되었지만 수신이 완료되지 않은 signal을 의미한다.
Sending Signal
Process Group

모든 프로세스는 단 하나의 process group(프로세스 그룹)에 속한다. 이 그룹은 양의 정수인 process group ID로 식별된다. 현재 프로세스의 process group ID를 알기 위해서는 이를 반환하는 getpgrp()함수를 사용할 수 있다.
#include <unistd.h>
pid_t getpgrp(void);
기본적으로 child process는 parent process와 동일한 프로세스 그룹에 속한다. 이때 프로세스는 setpgid() 함수를 사용하여 자신이나 다른 프로세스의 프로세스 그룹을 변경할 수 있다.
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
setpgid 함수는 프로세스 pid의 프로세스 그룹의 ID를 pgid로 변경한다. 만약 pid가 0이면, 현재 프로세스의 PID가 사용된다. pgid가 0이면, pid로 지정된 프로세스의 PID가 프로세스 그룹 ID로 사용됩니다. 다음은 PID가 15213인 프로세스에서 setpgid()함수를 호출한 예시이다.
setpgid(0, 0);
위 함수의 실행은 process group ID가 15213인 프로세스 그룹이 이미 존재한다면 PID가 15213인 프로세스를 해당 그룹에 추가한다. 만약 process group ID가 15213인 프로세스 그룹이 존재하지 않는다면 그러한 프로세스 그룹을 만들고 ID가 15213인 프로세스를 해당 그룹에 추가한다.
/Bin/kill 프로그램을 사용한 신호 보내기
/bin/kill 프로그램은 다른 프로세스나 프로세스 그룹에 임의의 신호를 보낸다. 예를 들어,
linux> /bin/kill -9 15213
위 명령은 process 15213에 signal -9(SIGKILL)을 보낸다. 이때 PID로 음수를 사용하면 해당 process group 15213에 존재하는 모든 프로세스에 해당 signal을 보낸다. 예를 들어,
linux> /bin/kill -9 -15213
위 명령은 process group 15213에 있는 모든 프로세스에 SIGKILL 신호를 보낸다.