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