[t:/]$ 지식_

fork,wait,exit

2011/03/24
root@dawnsea-Lenovo-G460:/home/dawnsea# ./process_sync_dawnsea 
Create Child, pid = 4795, seq_no = 0    // 자식 프로세스 10개를 생성한다.
Create Child, pid = 4796, seq_no = 1    // 식별을 용이하게 하기 위해서
Create Child, pid = 4797, seq_no = 2    // 자식 프로세스는 sleep(1)초 후 동작한다.
Create Child, pid = 4798, seq_no = 3
Create Child, pid = 4799, seq_no = 4
Create Child, pid = 4800, seq_no = 5
Create Child, pid = 4801, seq_no = 6
Create Child, pid = 4802, seq_no = 7
Create Child, pid = 4803, seq_no = 8
Create Child, pid = 4804, seq_no = 9      // 여기까지 10개의 자식 프로세스가 생성됐다.
Child End! seq_no = 0, pid = 4795, my_buffer = 106   // 자식 프로세스가 끝나기 시작했다.
Child End! seq_no = 2, pid = 4797, my_buffer = 102
Child End! seq_no = 1, pid = 4796, my_buffer = 101
Found! (my_buffer > 105), pid = 4795, Parent end    // 105 보다 큰 값을 갖는 자식 프로세스의
                        // 종료를 탐지한 것이다.
                        // wait의 리턴이 늦었음을 알 수 있다.
                        // 여기서 부모 프로세스는 종료했다.

Child End! seq_no = 3, pid = 4798, my_buffer = 103
Child End! seq_no = 4, pid = 4799, my_buffer = 101
Child End! seq_no = 5, pid = 4800, my_buffer = 102
Child End! seq_no = 6, pid = 4801, my_buffer = 106
Child End! seq_no = 7, pid = 4802, my_buffer = 106
Child End! seq_no = 8, pid = 4803, my_buffer = 103
Child End! seq_no = 9, pid = 4804, my_buffer = 106   // 자식 프로세스들이 차례로 종료했다.
#include <stdio.h>
#include <stdlib.h>
#include <linux/unistd.h>
#include <sys/syscall.h>

main()
{
        int i;          // 자식 프로세스 10개를 생성하기 위한 인덱스
        int my_buffer;      // 시스템 콜에서 값을 리턴 받기 위한 버퍼
        int child_status;       // 자식 프로세스가 exit로 넘긴 status 값을 저장하는 용도
        pid_t px, end_pid;      // 현재 생성한 pid와 종료한 자식 프로세스의 pid

        for (i = 0; i < 10; i++) {  // 10개의 자식 프로세스를 만들자
                px = fork();        // 프로세스 생성
                if (px < 0) {       // 프로세스 생성에 실패했다면?
                        printf("fork fail!\n"); // 에러 메시지 출력후
                        exit(1);        // 종료
                }

                if (px == 0) {  // 자식 프로세스 진입
                        srand(i * 1000 + time(NULL));       // 랜덤 값 초기화
                        my_buffer = syscall(SYS_dawnsea);   // 시스템 콜 호출 및 값 얻기
                        sleep(1);               // 메시지를 쉽게 보도록 시간차를
// 두고 실행하기 위한 sleep
                    do {
                                my_buffer += (rand() % 10) + 1; // 1~10의 랜덤 값을 계속 더함

                        } while (my_buffer <= 100);     // 100보다 커야 탈출
                    // my_buffer가 100보다 크면 탈출하여 종료 메시지를 찍는다
                       printf("Child End! seq_no = %d, pid = %d, my_buffer = %d\n", i, getpid(), my_buffer);

            // 105보다 크면 부모 프로세스를 즉시 종료시키기 위해 exit(0)을 호출한다.
                        if (my_buffer > 105) exit(0);   // 부모 프로세스가 0을 받는다.
                        else exit(1);           // 부모 프로세스는 0이 아닌 값을 받는다.

                } else {
            // 부모 프로세스 실행 영역이다. 현재 생성한 자식 프로세스 정보를 출력.
                        printf("Create Child, pid = %d, seq_no = %d\n", px, i);
                }
        }

        do {        // 자식 프로세스를 대기한다.
                end_pid = wait(&child_status);  // 자식 프로세스가 종료할 때마다 리턴한다.
                if (child_status == 0) {        // 종료한 자식 프로세스가 0을 보냈으면
                    // my_buffer에 105보다 큰 값이 들어있는 것이므로 즉시 종료한다.
                        printf("Found! (my_buffer > 105), pid = %d, Parent end \n\n", end_pid);
                        exit(0);
                }
        } while (child_status != 0); // 105이하 값이면 계속 대기로 들어간다.
        printf("Not Found(my_buffer > 105\n");  // 105 초과 값을 한 개도 못 찾은 경우다.
}








[t:/] is not "technology - root". dawnsea, rss