Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

wait(2)

1장. wait(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

프로세스 종료를 기다린다.


1.1절. 사용법

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status);
		


1.2절. 설명

주로 fork() 를 이용해서 자식 프로세스(:12)를 생성했을때 사용한다. wait() 를 쓰면 자식프로세스가 종료할때까지 해당영역에서 부모프로스쓰가 sleep() 모드로 기다리게 된다. 이는 자식프로세스와 부모프로세스의 동기화를 위한목적으로 부모프로세스가 자식프로세스보다 먼저 종료되어서 자식프로세스가 고아 프로세스(PPID 가 1)인 프로세스가 되는걸 방지하기 위한 목적이다.

만약 자식 프로세스가 종료되었다면 함수는 즉시 리턴되며, 자식이 사용한 모든 시스템자원을 해제한다.

그런데 어떤이유로 부모가 wait()를 호출하기 전에 자식 프로세스가 종료버리는 경우도 있다(잘못된 메모리 연산등으로 인한 죽음, 혹은 정상적으로), 이럴경우 자식프로세스는 좀비(:12)프로세스가 되는데, wait()함수는 즉시 리턴하도록 되어있다.

wait()의 인자 status 를 통하여 자식 프로세스의 상태를 받아올수 있는데, 자식프로세스의 상태값은 자식프로세스의 종료값 * 256(FF) 이다.


1.3절. 반환값

종료된 자식의 프로세스 ID는 에러일경우 -1 그렇지 않을경우 0을 반환한다.


1.4절. 에러

다양한 원인에 의해서 에러가 발생할수 있으며 아래와 같은 에러 메시지들이 있다.

ECHILD

기다리는 자식프로세스가 더이상 존재하지 않을 경우

ENOTSOCK

s 가 소켓(:12)이 아닌 파일일경우

ENOTCONN

소켓이 연결되어 있지 않을경우

ENOBUFS

시스템에 연산을 위해서 이용할수 있는 자원이 부족할때


1.5절. 예제

#include <sys/types.h>

#include <sys/wait.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int pid;
    int status;

    pid = fork();
    // 자식 프로세스 
    if (pid < 0)
    {
        perror("FORK ERROR :");
        exit(0);
    }    

    if (pid == 0)
    {
        int i;
        for (i = 0; i < 5; i++) 
        {
            printf("Child : %d\n", i);
            sleep(2);
        }
        exit(3);
    }
    else
    {
        // 부모프로세스는 자식프로세스가 
        // 종료할때까지 기다린다. 
        printf("I wait Child(%d)\n", pid);
        wait(&status);
        printf("Child is exit (%d)\n", status);
    }
}
		
위의 예제를 컴파일후 실행시키면 다음과 같은 결과를 보여준다.
[root@localhost c_source]# ./wait
I wait Child(12128)
Child : 0
Child : 1
Child : 2
Child : 3
Child : 4
Child is exit (768)
		

참고문헌 :
  • waitpid(2), fork(2), 좀비(:12), 시스템프로그래밍(:12)