Linux/Linux_programing

System - 05. wait() 프로세스 동기화

sosal 2009. 10. 31. 05:08
반응형

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