반응형
fork(2)
#include <unistd.h>
pid_t fork(void);
현재 실행중인 프로세스와 동일한 기능을 하는 새로운 프로세스를 생성합니다.
새로운 프로세스를 자식프로세스라고 하고 기존의 프로세스를 부모프로세스라고 합니다.
부모 프로세스와 자식 프로세스는 아래의 내용이외에는 거의 동일합니다.
부모 프로세스와 자식 프로세스의 차이
- 프로세스ID가 서로 다르며, 부모 프로세스ID도 다릅니다.
- 자식프로세스의 PPID(getppid(2))는 부모프로세스의 PID(getpid(2)) 같습니다.
- 자식프로세스에서 리소스 통계는 0으로 초기화됩니다.
- 시그널 설정은 상속되지 않습니다.
- open된 파일은 유지되지만, file lock은 자식 프로세스에서는 해제됩니다.
UNIX / LINUX에서는 프로세스 생성과 실행할 binary 교체는 분리되어 있습니다.
A라는 프로그램에서 B라는 프로그램을 실행하기 위해서는 fork(2) + exec계열함수를 연속으로 호출하여 실행해야 합니다.
fork(2)는 자신과 같은 프로세스(A프로그램)를 생성하고, exec( )계열함수는 프로세스의 내용을 B프로그램으로 교체합니다.
파라미터
없음
RETURN
양수
- fork()에서 1 이상을 return 받은 프로세스는 부모 프로세스이며, return값은 자식프로세스ID입니다.
즉, 부모는 방금 생성한 자식 프로세스 ID를 알 필요가 있기때문에 return 받습니다.
차일드 프로세스의 종료를 대기하거나 SIGCHLD에 대한 signal 처리를 위해서 필요합니다.
또한 자식 프로세스ID는 여러개가 있을 수 있기 때문에 자식프로세스ID를 얻는 함수가 없습니다.
0
- fork()에서 0을 return 받은 프로세스는 차일드 프로세스 자신입니다.
부모 프로세스 ID는 getppid(2)를 통해서 얻을 수 있기 때문에 0을 return받습니다.
-1
- 오류가 발생하여 자식 프로세스가 생성되지 않았습니다. 상세 오류내용은 errno에 설정됩니다.
EAGAIN : 최대 프로세스 갯수 제약(RLIMIT_NPROC)에 도달하여 프로세스 생성에 실패함.
ENOMEM : 메모리 부족으로 프로세스 생성에 실패함
ENOSYS : 이 시스템은 메모리관리 unit이 없어서 fork를 지원하지 않음.
활용 예제
Sample
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
......
pid_t pid;
/* 여기는 하나의 프로세스만 있습니다. */
pid = fork();
/* 여기는 두개의 프로세스가 되었습니다. (pid가 -1이 아니라면) */
if(pid > 0) {
printf("I am a prarent process. child process id: %d\n", pid);
} else if(pid == 0) {
printf("I am a child process.")
} else {
fprintf(stderr, "fork() error: %s\n", strerror(errno));
}
......
see also: Process 관리 함수
반응형
'C언어 header > unistd.h' 카테고리의 다른 글
fsync(2) - kernel에 buffering된 데이터를 disk로 동기화하기(Meta 정보 포함) (0) | 2019.10.01 |
---|---|
fstat(2) - 열린 파일의 상태 및 정보를 얻는 함수 (0) | 2019.10.01 |
fdatasync(2) - kernel에 buffering된 데이터를 disk에 동기화 하기(Meta 정보 제외) (0) | 2019.10.01 |
execvp(3) - PATH설정된 프로그램 실행 (배열방식의 argument) (0) | 2019.10.01 |
execve(2) - 프로그램 실행. (1) | 2019.10.01 |