끄적끄적

반응형

* 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);

}


반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]