* 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);
}
프로세스 (0) | 2016.12.02 |
---|---|
[프로그래밍] fork 함수와 wait 함수의 이해 (0) | 2016.12.01 |
[프로그래밍] 간단한 pipe()에 대한 소스 (0) | 2016.12.01 |
[프로그래밍] Socket inheritance with fork/dup2/exec (0) | 2016.11.30 |
[프로그래밍] strtok_r 과 strtok 의 차이점? (0) | 2016.11.28 |