×
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()를 통해 


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


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


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



















반응형