반응형


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







이전 게시물에서 fork()에 대한 기초를 익혔다면 이번에는 다중 fork()를 통해 


자식 프로세스와 부모 프로세스가 어떻게 진행되는지 확인한다.


설명에 앞서 새로 나온 함수들에 대해 알아본다.


termindatedChild : wait함수에서 반환 한 값(pid)을 가지고 있는다.


WIFEXITED : 자식 프로세스가 정상 종료한 경우 TRUE를 반환한다.


WEXITSTATUS : 자식 프로세스의 전달 값을 반환한다.



부모 프로세스가 5번의 fork를 통해 pid배열에 저장하게 된다.


이때 컨텍스트 스위칭(Context switching)을 통해 부모 프로세스가 아닌 자식 프로세스가 시작된다면 자식 프로세스가 진행되고,


그렇지 않다면 계속해서 부모 프로세스가 진행 될 것이다.


부모 프로세스는 다음 for문에서 자식 프로세스를 wait()를 통해 기다리게 되고, 


아래 if else문을 통해 어떤 것들이 실행되고 있는지 출력해준다. 




첫번째 실행 했을 때의 결과 화면은 다음과 같다.




이에 따른 상세한 그림은 아래와 같다.









물론 여러번 실행하면 이와 다른 상황들이 계속 나타날 지도 모른다. 왜냐면 스케줄러가 지정하는 프로세스에 따라


부모 프로세스가 움직일 수 도 있고, 자식 프로세스가 움직일 수 도 있다.




총 5번의 실행 결과는 다음과 같다.








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
34
35
36
37
38
39
40
41
42
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int N = 5;
 
    pid_t pid[N]; /* process id */
    int childStatus;
    int i;
 
    for (i = 0; i < N; i++)
    {
        pid[i] = fork();
        if (pid[i] == 0)
        {
            printf("Now pid[%d] is die\n",i);
            exit(100+i);
        }        
        // Create multiple child processes
    }
 
    for (i = 0; i < N; i++)
    {
        pid_t terminatedChild = wait(&childStatus);
 
        if (WIFEXITED(childStatus))
        {
            // The child process has termindated normally
 
            printf("Child %d has terminated with exit status %d\n", terminatedChild, WEXITSTATUS(childStatus));
        }
 
        else
            printf("Child %d has terminated abnormally\n", terminatedChild);
    }
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus



















반응형