/*
* http://sosal.tistory.com/
* made by so_Sal
*/
fork 함수로 생성된 자식 프로세스는 독립적으로 실행됩니다.
따라서 부모프로세스는 자식프로세스가 하는 일을 알 수 없고,
변수의 공유나 자식프로세스가 계속 살아있는지 등에 대한 정보를
기본적으로는 알 수 없습니다.
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *stat_loc); //call by reference
stat_loc은 종료된 프로세스의 pid 값을 리턴하여 보통 pid_t 변수에다 저장합니다.
ex)
int stat_loc;
pid_t child_pid;
child_pid = wait(&stat_loc);
wait 시스템콜은 자식프로세스중 하나가 종료될 때까지 부모 프로세스를 기다리게 합니다.
리턴값은 자식 프로세스의 PID.
메크로
WIFEXITED(stat_val) :: 0이 아니라면 자식프로세스가 정상종료
WEXITSTATUS(stat_val) :: 자식프로세스가 정상 종료했다면, 자식프로세스의 종료코드
WIFSIGNALED(stat_val) :: 자식프로세스가 정상 종료했다면 자식프로세스가 처리되지 않은 신호에 의해 종료된 것.
WTERMSIG(stat_val) :: WIFSIGNALED 가 0이 아닌 경우 신호의 번호
WIFSTOPPED(stat_val) :: 0이 아니면 자식프로세스가 중지된 것
WSTOPSIG(stat_val) :: WIFSTOPPED가 0이 아닌 경우 신호의 번호
메크로 함수는 필요할때 레퍼런스 북이나 인터넷을 찾아서 사용하도록 합니다.
외우는건 뇌 메모리 (ㅋㅋ?)의 무리를 줄 수 있습니다... ;; ;;
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h> //플레그 값이 들어있는 헤더
#include<sys/wait.h> //wait() 함수
int main(void){
pid_t pid;
pid = fork();
if(pid==-1){
perror("Fork error\n");
exit(EXIT_FAILURE);
}
else if(pid==0){ //child process 소스
sleep(3);
exit(100);
} //3초후에 100을 반환하며 종료됩니다.
//아래부터는 부모 프로세스의 소스가 되겠습니다.
int stat_value;
pid_t child_pid;
child_pid = wait(&stat_value);
//wait함수는 기다립니다.
printf("Child-process has finished , PID :: %d\n",child_pid);
if(WIFEXITED(stat_value)) //정상종료 되었다면
printf("Child exit() code :: %d\n", WEXITSTATUS(stat_value));
//exit() 종료 코드를 반환합니다. 100이 출력되겠습니다.
else
printf("child terminated abnormally\n");
//예외처리
exit(0); //부모프로세스의 종료
}
작은 동기화입니다.
아주 간단하고 기초적인 동기화입니다.
System 게시물들은
begining Linux programing.
유닉스 프로그래밍
Linux 언쉬리드' 를 참고하였습니다.
'Linux > Linux_programing' 카테고리의 다른 글
IPC - 02. 신호 처리, sigaction 안정적 신호 인터페이스 (0) | 2009.10.31 |
---|---|
IPC - 01. 프로세스 신호 signal 주고받기 (1) | 2009.10.31 |
System - 04. fork 복제 프로세스 생성 (0) | 2009.10.28 |
System - 03. exec () 계열. 프로세스 이미지 대체 (1) | 2009.10.23 |
Socket - 04. 다중 프로세스 네트워크 프로그래밍 (0) | 2009.10.23 |