Manpages

이 름

vfork − 자 식 프 로 세 스 를 만 들 고 부 모 프 로 세 스 를 봉 쇄 한 다 .

사 용 법

#include <unistd.h>

pid_t vfork(void);

표 준 설 명

(XPG4 / SUSv2 / POSIX 초 안 에 서 .) vfork()함 수 는 vfork()에 의 해 생 성 된 프 로 세 스 가 vfork()의 반 환 값 을 저 장 하 기 위 해 사 용 된 pid_t 타 입 의 변 수 외 다 른 데 이 터 를 수 정 하 거 나 , vfork()를 호 출 하 기 전 에 함 수 에 서 리 턴 되 거 나 , _exit()를 성 공 적 으 로 호 출 하 기 전 에 다 른 함 수 를 호 출 하 거 나 , exec 함 수 계 열 중 하 나 를 호 출 할 경 우 행 동 을 정 의 할 수 없 다 는 것 을 제 외 하 고 는 fork()와 같 은 효 과 를 가 진 다 .

에 러

EAGAIN

프 로 세 스 들 이 너 무 많 다 . - 다 시 시 도 .

ENOMEM

새 프 로 세 스 를 위 한 스 왑 공 간 이 충 분 하 지 않 다 .

리 눅 스 설 명

fork(2)처 럼 , vfork는 호 출 프 로 세 스 의 자 식 프 로 세 스 를 만 든 다 . 세 부 사 항 과 반 환 값 그 리 고 에 러 는 fork(2)를 참 조 해 라 .

vfork()clone(2)의 특 별 한 경 우 이 다 . 이 함 수 는 부 모 프 로 세 스 의 페 이 지 테 이 블 을 복 사 하 지 않 고 새 프 로 세 스 를 만 든 다 . 이 함 수 는 자 식 이 execve()후 에 즉 시 만 들 어 져 야 하 는 성 능 에 민 감 한 응 용 프 로 그 램 에 서 는 유 용 하 다 .

vfork() 는 자 식 이 execve(2)_exit(2)를 호 출 할 때 까 지 부 모 가 일 시 중 지 되 기 때 문 에 fork와 는 다 르 다 . 자 식 프 로 세 스 는 execve() 가 자 식 에 의 해 실 행 될 때 까 지 스 택 을 포 함 하 여 부 모 와 모 든 메 모 리 를 공 유 한 다 . 자 식 프 로 세 스 는 현 재 함 수 나 exit()호 출 에 서 반 환 해 서 는 않 되 지 만 _exit()호 출 에 서 는 된 다 .

시 그 널 핸 들 러 는 상 속 되 지 만 공 유 되 지 는 않 는 다 . 부 모 프 로 세 스 에 대 한 신 호 는 자 식 이 부 모 를 놓 아 준 후 에 도 착 한 다 .

역 사 적 설 명

리 눅 스 에 서 , fork()는 copy-on-write 페 이 지 를 사 용 하 여 수 행 된 다 . 그 래 서 단 지 fork()에 의 해 생 긴 불 이 익 은 부 모 페 이 지 테 이 블 복 사 및 자 식 을 위 한 단 일 태 스 크 구 조 체 를 만 들 기 위 해 요 구 되 는 시 간 과 메 모 리 이 다 . 그 러 나 , 오 래 전 에 fork()exec()를 실 행 한 후 즉 시 불 필 요 하 게 , 호 출 프 로 세 스 의 데 이 터 공 간 의 완 전 한 복 사 를 하 도 록 요 구 했 다 . 그 후 효 율 성 을 위 해 , BSD 는 부 모 프 로 세 스 의 주 소 공 간 을 완 전 히 복 사 하 지 는 않 지 만 execve()가 호 출 되 거 나 종 료 될 때 까 지 부 모 의 메 모 리 와 쓰 레 드 제 어 를 빌 리 는 vfork 시 스 템 콜 을 소 개 했 다 . 부 모 프 로 세 스 는 자 식 프 로 세 스 가 해 당 자 원 을 사 용 할 때 까 지 일 시 중 지 된 다 . vfork의 사 용 은 신 중 해 야 한 다 . -- 예 를 들 어 , 변 수 들 이 레 지 스 터 에 잡 혀 있 는 지 를 알 고 있 는 경 우 에 부 모 프 로 세 스 에 있 는 데 이 터 를 수 정 해 서 는 안 된 다 .

버 그

이 함 수 는 리 눅 스 가 과 거 에 이 러 한 불 안 의 원 인 을 되 살 아 나 게 하 는 것 보 다 더 운 이 없 다 . BSD 맨 페 이 지 상 태 : "이 스 스 템 콜 은 적 당 한 시 스 템 메 카 니 즘 이 수 행 될 때 사 라 질 것 이 다 . 사 용 자 들 은 vfork 의 메 모 리 공 유 의 미 론 에 의 존 해 서 는 안 된 다 . 왜 냐 하 면 그 런 경 우 이 함 수 는 fork의 동 의 어 이 기 때 문 이 다 . "

정 상 적 으 로 말 해 서 , 위 에 보 여 준 표 준 설 명 은 다 음 exec가 실 패 하 고 그 리 고 다 음 에 일 어 날 일 이 정 의 되 지 않 기 때 문 에 vfork()의 사 용 을 허 용 하 지 않 는 다 . BSD 맨 페 이 지 상 태 : " 가 능 한 데 드 락 (deadlock) 상 태 를 피 하 기 위 해 , vfork 상 태 에 있 는 자 식 프 로 세 세 스 들 은 SIGTTOU 나 SIGTTIN 신 호 를 보 내 서 는 안 된 다 ; 그 보 다 출 력 또 는 ioctls 는 허 용 되 며 입 력 시 도 는 파 일 끝 을 가 리 키 게 된 다 .

현 재 (Linux 2.3.25), strace(1)vfork()을 따 라 갈 수 없 으 며 커 널 패 치 를 해 야 한 다 .

역 사

vfork()시 스 템 콜 은 3.0 BSD에 서 나 타 났 다 . BSD 4.4에 서 이 함 수 는 fork()와 동 의 어 이 지 만 , NetBSD는 이 함 수 를 다 시 소 개 했 다 . cf. http://www.netbsd.org/Documentation/kernel/vfork.html . 리 눅 스 에 서 , 이 함 수 는 2.2.0-pre6 나 그 때 까 지 fork()와 같 다 . 2.2.0-pre9(i386에 서 는 다 른 아 키 텍 쳐 보 다 다 소 늦 다 ) 이 후 에 , 이 함 수 는 독 립 적 인 시 스 템 콜 이 다 . 지 원 은 glibc 2.0.112 에 서 추 가 되 었 다 .

호 환

vfork 함 수 는 다 른 OS에 서 같 은 이 름 을 가 지 고 있 는 함 수 들 과 약 간 비 슷 하 다 . 표 준 에 서 vfork 를 수 행 할 때 의 요 구 들 은 fork를 수 행 할 때 의 것 보 다 도 적 다 . 그 래 서 두 함 수 가 동 의 어 일 때 의 수 행 은 잘 된 다 . 특 히 , 프 로 그 래 머 는 execve()_exit() 가 호 출 될 때 까 지 블 럭 된 채 로 남 아 있 는 부 모 프 로 세 스 에 의 존 할 수 없 으 며 어 떤 특 정 행 동 w.r.t 공 유 메 모 리 에 의 존 할 수 도 없 다 .

관 련 항 목

clone(2), execve(2), fork(2), wait(2)

역 자

정 강 훈 <skyeyes [AT] soback.net>, 2000년 9월 16일