본문 바로가기

컴퓨터/언어,프로그래밍

fork() execl() wait()

- 자료 출처 : www.joinc.co.kr

 

* fork는 자식프로세스를 만들기 위해서 사용되는 프로세스 생성기이다.

 

#include <unistd.h>

 

pid fork(void);

 

실패할 경우 -1을

성공할 경우 자식 프로세스는 0, 부모 프로세스는 이외의 값이 리턴된다.

 

 

* execl() : 현재 프로세스 이미지를 새로운 프로세스 이미지로 바꾼다.

 

#include <unistd.h>

int execl(const char *path, const char *arg, ...);

처음 인자 : 파일의 경로

두번째 부터의 인자 : 파일의 경로에 넘겨줄 인자

마지막 인자 : 널(0, NULL)값을 써주어야 한다.

 

 

* wait() : 자식 프로세스 종료를 기다린다.

 

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);

자식프로세스가 종료할때까지 해당영역에서 부모프로스쓰가 sleep 모드로 기다리게 된다.

이는 자식프로세스와 부모프로세스의 동기화를 위한목적으로

부모프로세스가 자식프로세스보다 먼저 종료되어서

자식프로세스가 고아 프로세스(PPID 가 1)인 프로세스가 되는걸 방지하기 위한 목적이다.

 

자식 프로세스가 종료되었다면 함수는 즉시 리턴되며,

자식이 사용한 모든 시스템자원을 해제한다.

 

wait()의 인자 status 를 통하여 자식 프로세스의 상태를 받아올수 있는데,

자식프로세스의 상태값은 자식프로세스의 종료값 * 256(FF) 이다.

 

wait(NULL);

 

 

* waitpid() : 자식 프로세스의 종료를 기다린다.

 

#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *status, int options);

waitpid 함수는 인수로 주어진 pid 번호의 자식프로세스가 종료되거나,

시그널 함수를 호출하는 신호가 전달될때까지 waitpid 호출한 영역에서 일시 중지 된다.

 

< -1 프로세서 그룹 ID가 pid 의 절대값과 같은 자식 프로세스를 기다린다.
   -1 임의의 자식프로세스를 기다린다. 이것은 wait(2) 와 동일하다.
    0 프로세스 그룹 ID가 호출 프로세스의 ID와 같은 자식프로세스를 기다린다.
 > 0 프로세스 ID가 pid 의 값과 같은 자식 프로세스를 기다린다.

매크로

WIFEXITED(status)
: 자식이 정상적으로 종료되었다면 non-zero 이다.
WEXITSTATUS(status)
: exit()를 호출하기 위한 인자나 return 값이 설정되고
종료된 자식의 반환 코드의 최하위 8비트를 평가한다.
이 매크로는 정상정료 - WIFEXITED(status) - 일때만 평가된다.
WIFSIGNALED(status)
: 자식프로세스가 어떤 신호때문에 종료되었다면 참을 반환한다.
WTERMSIG(status)
: 자식프로세스를 종료하도록한 신호의 번호를 반환한다.
당연히 WIFSIGNALED 가 non_zero 일 경우에만 사용할수 있다.
WIFSTOPPED(status)
: 반환의 원인이 된 자식프로세스가 현재 정지되어 있다면 참을 반환한다.
WSTOPSIG(status)
: 자식을 정지하도록 야기한 신호의 숫자를 반환한다.
WIFSTOPPED가 non-zero 일경우에만 사용할수 있다.

 

- 예제코드 -

#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)
    {
        printf("Im Child\n");
        sleep(10);
        return 2;
    }
    else
    {
        printf("Parent: wait (%d)\n", pid);
        waitpid(pid, &status, 0);
        if (WIFEXITED(status))
        {
            printf("정상종료\n");
            printf("리턴값 %d\n", WEXITSTATUS(status));
        }
        else if (WIFSIGNALED(status))
        {
            printf("신호받았음\n");
            printf("신호번호 %d\n", WTERMSIG(status));
        }
    }
    exit(0);
}


'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글

dup2()  (0) 2009.05.27
dup2  (1) 2009.05.27
fork 함수와 wait 함수의 이해! 자식프로세스의 시작.. 그리고 끝!  (0) 2009.05.27
Linux system() 와 fork(), execl() 사용  (0) 2009.05.27
프로세스  (0) 2009.05.26
제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...