책/윤성우 TCPIP

10-03 : 시그널 핸들링 (3) ~ 10-04 멀티태스킹 기반의 다중접속 서버(1)

babystep 2020. 12. 20. 23:57
728x90
  •  
    • 시그널핸들링을 통한 좀비 프로세스의 소멸
      • 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. 1단계 : 에코서버(부모 프로세스) accept함수호출을 통해서 연결요청을 수락한다.
        2. 2단계: 이때 얻게 되는 소켓의 파일 디스크립터를 자식 프로세스를 생성해서 넘겨준다.
        3. 3단계 : 자식 프로세스는 전달받은 파일 디스크립터를 바탕으로 서비스를 제공한다.
      • 위의 단계에서 혼란스러운 부분은 자식 프로세스에게 소켓의 파일 디스크립터를 넘기는 방법인데 실제 코드상에서는 걱정할 필요가 없다 왜냐하면 자식 프로세스는 부모 프로세스가 소유하고 있는 것을 전부 복사하기 때문이다. 사실상 파일 디스크립터를 넘기는 과정은 별도로 거칠 필요가 없다.
728x90