/*
 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 언쉬리드' 를 참고하였습니다.

Posted by sosal sosal

댓글을 달아 주세요

  1. 2010.03.12 09:13

    fork, exec 개념이 안 잡혀서 이리저리 찾아보고 있었는데, 님 블로그가 제일 설명이 잘 된거 같아요...도움이 많이 되었습니다...감사해요~~~

  2. 2010.10.19 11:16

    안녕하세요. 댓글없이 퍼가서 죄송합니다. 저도 블로그를 운영하는 입장이라 블로거님 마음 이해가 됩니다. 업무상 필요한 자료를 찾다가 유용한 자료를 발견했는데, 심신이 바쁜 나머지 댓글을 못남겼네요. 도움이 많이 되었습니다. 앞으로도 좋은 글 부탁 드릴께요.

  3. 2010.12.10 21:49

    또 잘 이해하고갑니다. 뇌메모리 ㅋㅋㅎㅋ