반응형

- 본 내용은 Linux (Ubuntu 14.04 lts)를 기반으로 제작되었습니다. -







멀티 프로세스 소켓 프로그래밍을 위해서는 fork()가 뭔지, 어떤 역할을 하게 되는지 알아야 한다.


fork()란?


부모 프로세스에서 자식 프로세스를 하나 복제 생성해 주는 역할을 한다.


이때 복제 생성 시, 부모 프로세스와 같은 프로세스가 만들어진다.


즉, PC,FD, stack, heap 등등의 모든것이 자식 프로세스에 복사가 된다.


이때 fork()함수의 리턴 값


부모 프로세스에는 자식 프로세스의 PID(Process ID)가 들어가고


자식 프로세스에서는 fork()의 리턴값이 0이 들어가게 된다.


자세한 내용은 코드와 이미지를 통해 확인 할 수 있다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <sys/types.h>
#include <stdio.h>
int a = 6/* global (external) variable */
int main(void)
{
    int b; /* local variable */
    int childStatus;
    pid_t pid; /* process id */
    
 
    b = 88;
        
    printf("Before fork\n");
    
    pid = fork();
    printf("This is pid value :: %d // %d\n",pid,getpid());
    if (pid == 0
    { /* child */
        a++; b++;
        printf("This is the child and the test number is %d %d // %d\n",a,b,getpid());
    } 
    
    else /* parent */
    {
        wait(&childStatus);
        printf("This is the parent and the test number is %d %d // %d\n",a,b,getpid());
    }
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus








코드를 살펴보면 다음과 같다.


pidpid_t라는 타입으로 선언한다. 그리고 전역변수 a, 지역변수 b를 선언하여 fork()되어 어떻게 돌아가는지 확인해본다.


fork()된 자식 프로세스는 pid가 0이니 if문에서 pid == 0으로 접근하게 될 것이고,


부모 프로세스는 pid가 자식 프로세스 id를 받게되니 else로 들어가게 될 것이다.


그림의 첫번째 This is pid value :: 7404 // 7403은 pid가 0이 아니니 부모 프로세스가 찍어낸 것임을 알 수 있다.


7404는 자식 프로세스 id, 7403은 부모 프로세스 id임을 확인 가능하다.


그리고 자식 프로세스에서는 a와 b를 1씩 증가하시키기에 값이 증가된 것을 확인 할 수 있다.


부모 프로세스 else 부분에서는 그대로 값을 출력해줌을 알 수 있다.


이때 else 부분에 wait(&childStatus)의 의미는 부모 프로세스에서 자식 프로세스가 끝날 때 까지 기다려주는 것인데, 


&childStatus인자에 자식 프로세스가 종료 될 때의 상태 정보를 가져오게 된다.  




참고사항 :: 


pid_t란?


프로세스 번호(pid)를 저장하는 타입(t)이라는 의미이다.


시스템마다 프로세스번호가 int일 수도 있고 아닐 수도 있기 때문에 pid_t를 사용하는 것이 이식성면에서 더 나은 코드가 된다.





반응형