×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,238,571명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

- 본 내용은 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를 사용하는 것이 이식성면에서 더 나은 코드가 된다.





반응형