- 시그널핸들링을 통한 좀비 프로세스의 소멸
- remove_zombie.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
void read_childproc(int sig)
{
int status;
pid_t id = waitpid(-1, &status, WNOHANG);
if(WIFEXITED(status))
{
printf("Removed proc id: %d \n", id);
printf("Child send: %d \n", WEXITSTATUS(status));
}
}
int main(int argc, char *argv[])
{
pid_t pid;
// 시그널 SOGCHLD에 대한 시그널 핸들러의 등록과정을 보이고 있다
// 이로써 자식 프로세스가 종료되면 7행에 정의된 함수가 호출된다.
// 그리고 이 함수 내에서의 waitpid함수호출로 인해 자식 프로세스는
// 좀비가 되지않고 소멸한다.
struct sigaction act;
act.sa_handler = read_childproc;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGCHLD, &act, 0);
// 부모 프로세스를 통해서 총 두개의 자식 프로세스를 생성하고 있다.
pid = fork();
if( pid == 0) /* 자식 프로세스 실행 영역 */
{
puts("Hi! I'm child process");
sleep(10);
return 12;
}
else /* 부모 프로세스 실행영역 */
{
printf("Child proc id: %d \n", pid);
pid = fork();
if( pid == 0 )/* 또 다른 자식 프로세스 실행영역 */
{
puts("Hi! I'm child process");
sleep(10);
exit(24);
}
else
{
int i;
printf("Child proc id: %d \n", pid);
// 시그널 SIGCHLD의 발생을 대기하기 위해서 부모 프로세스를 5초간 5회 멈춰
// 놓았다. 물론 시그널이 발생하면 부모 프로세스는 깨어나기 때문에 실제
// 멈춰있는 시간은 25초가 되지 않는다.
for(i =0 ; i < 5; i++)
{
puts("wait...");
sleep(5);
}
}
}
return 0;
}
- 10-04 멀티태스킹 기반의 다중접속 서버
- 프로세스 기반의 다중접속 서버의 구현 모델
- 이전에 구현했던 에코 서버는 한번에 하나의 클라이언트에게만 서비스를 제공할 수 있었다. 즉 동시에 둘 이상의 클라이언트에게 서비스를 제공하지 못하는 구조였다. 따라서 이번에는 동시에 둘 이상의 클라이언트에게 서비스를 제공하는 형태로 에코 서버를 확장해 보겠다.
- 위 그림에서 보이듯이 클라이언트의 서비스 요청(연결요청)이 있을 때마다 에코서버는 자식 프로세스를 생성해서 서비스를 제공한다. 즉 서비스를 요청하는 클라이언트의 수가 다섯이라면 에코 서버는 추가로 다섯개의 자식 프로세스를 생성해서 서비스를 제공한다. 이를 위해서 에코서버는 다음과정을 거친다.
- 1단계 : 에코서버(부모 프로세스)는 accept함수호출을 통해서 연결요청을 수락한다.
- 2단계: 이때 얻게 되는 소켓의 파일 디스크립터를 자식 프로세스를 생성해서 넘겨준다.
- 3단계 : 자식 프로세스는 전달받은 파일 디스크립터를 바탕으로 서비스를 제공한다.
- 위의 단계에서 혼란스러운 부분은 자식 프로세스에게 소켓의 파일 디스크립터를 넘기는 방법인데 실제 코드상에서는 걱정할 필요가 없다 왜냐하면 자식 프로세스는 부모 프로세스가 소유하고 있는 것을 전부 복사하기 때문이다. 즉 사실상 파일 디스크립터를 넘기는 과정은 별도로 거칠 필요가 없다.
'책 > 윤성우 TCPIP' 카테고리의 다른 글
10-05 TCP의 입출력 루틴(Routine)분할 (0) | 2020.12.22 |
---|---|
10-04 멀티태스킹 기반의 다중접속 서버(2) (0) | 2020.12.21 |
10-03 : 시그널 핸들링 (2) (0) | 2020.12.19 |
10-01 프로세스의 이해와 활용 (4) ~ 10-03 : 시그널 핸들링 (1) (0) | 2020.12.18 |
10-1 프로세스의 이해와 활용 (0) | 2020.12.15 |