fork 와 vfork (미 완성, 매일 업데이트 중...)
1. 함수 의 설명:
#include <unistd.h>
pid_t fork(void);
2. 반환 값:
fork 함수 가 한 번 호출 되면 두 번 반 환 됩 니 다. (주 프로 세 스 가 새로 만 든 하위 프로 세 스 의 프로 세 스 ID 를 되 돌려 주 고, 하위 프로 세 스에 되 돌려 주 는 것 은 0 입 니 다.)프로 세 스 생 성 에 실 패 했 을 때 fork 반환 값 은 - 1 입 니 다.
3. 함수 상세 설명
1. 하위 프로 세 스 는 부모 프로 세 스 의 사본 입 니 다.
하위 프로 세 스 가 fork 를 통 해 생 성 된 후.하위 프로 세 스 와 부모 프로 세 스 는 fork 호출 후 l 명령 을 계속 실행 합 니 다. 하위 프로 세 스 는 부모 프로 세 스 의 사본 입 니 다.여기 서 특히 주의해 야 할 것 은 하위 프로 세 스 가 부모 프로 세 스 의 복사 본 을 얻 는 것 이지 부자 프로 세 스 가 데이터 공간 을 공유 하 는 것 이 아 닙 니 다.그러나 부자 프로 세 스 는 본문 을 공유 할 것 이다.다음 프로그램 에서 보 듯 이:
#include <stdio.h>
#include <unistd.h>
int main()
{
int a = 9;
pid_t pid = -1;
if((pid = fork()) < 0)
{
// ID ,
printf("fork error!!
");
return -1;
}
else if(pid == 0)
{
// a , a++ a 。 a 。
a++;
}
return 0;
}
2. 버퍼 복사 로 인 한 문제
우리 가 호출 하고 있 을 때
fork 전에 표준 I/O (버퍼 가 있 는 I/O) 를 사용 하면 사용 합 니 다.
fork 전에 표준 출력 흐름 을 새로 고침 (또는 현상) 하 는 것 이 좋 습 니 다.있다
fork 가 하위 프로 세 스 를 만 든 후 시스템 은 하위 프로 세 스 를 위해 부모 프로 세 스 데이터 공간 과 표준 출력 버퍼 를 복사 합 니 다.표준 출력 버퍼 를 새로 고치 지 않 으 면 호출 합 니 다.
fork 때 표준 출력 을 통 해 출력 된 데이터 가 버퍼 에 있 으 면 하위 프로 세 스 도 버퍼 복사 본 을 가지 고 있 습 니 다.다음 프로그램 에서 보 듯 이:
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid = -1;
//printf , , 。 , 。 : before fork
printf("before fork!!
");
if((pid = fork()) < 0)
{
// ID ,
printf("fork error!!
");
return -1;
}
else if(pid == 0)
{
//
}
return 0;
}
표준 출력 (기본 터미널) 이 프로그램 을 실행 하지 않 으 면 출력 은 (이 출력 은 fork 를 호출 하기 전에 메 인 프로 세 스 의 printf 출력) 입 니 다.
before fork!!
이 프로그램의 표준 출력 을 파일 로 재 설정 하면 다음 과 같은 결 과 를 얻 을 수 있 습 니 다. (첫 번 째 는 호출 입 니 다.
fork 이전, 주 프로 세 스 의 printf 출력, 두 번 째 는 버퍼 복사 후 하위 프로 세 스에 서 출력):
before fork!!
before fork!!
3. 표준 출력 재 설정:
만약 우리 가 부모 프로 세 스 의 표준 출력 으로 방향 을 바 꾸 었 다 면, 하위 프로 세 스 의 표준 출력 도 방향 을 바 꿀 것 입 니 다.즉, fork 는 부모 프로 세 스 에서 열 린 모든 파일 설명 자 를 하위 프로 세 스 로 복사 합 니 다.
4. 파일 공유
위 에서 말 한 바 와 같이, 우 리 는 fork 를 호출 한 후에, 시스템 은 부모 프로 세 스에 서 열 린 모든 파일 설명 자 를 하위 프로 세 스에 복사 할 것 이라는 것 을 알 게 되 었 다.부모 프로 세 스 와 하위 프로 세 스 는 열 린 파일 시트 항목 을 공유 합 니 다. 부모 프로 세 스 는 하위 프로 세 스 와 같은 파일 오프셋 을 공유 합 니 다.하위 프로 세 스 와 부모 프로 세 스 간 파일 접근 의 동기 화 를 만족 시 키 려 면 fork 호출 후 파일 설명 자 를 처리 하 는 데 두 가지 흔 한 상황 이 있 습 니 다.
5. fork 의 두 가지 용법:
6. 다른 말:
일부 운영 체 제 는 fork 와 exec 를 합 쳐 spawn 이 라 고 부른다.UNIX 는 포크 와 exec 사이 에서 다른 필요 한 작업 을 할 수 있 도록 분리 합 니 다.예 를 들 어 표준 출력 으로 재 설정, 사용자 ID 설정 등 이다.또 어떤 때 는 우리 가 fork 를 호출 한 후에 exec 를 실행 할 필요 가 없다.따라서 유 닉 스 시스템 에 서 는 fork 와 exec 를 통합 하지 않 았 습 니 다.
2. vfork 함수
1. 함수 설명:
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
2. 반환 값:
vfork 함수 의 반환 값 은 fork 함수 의 반환 값 과 같 습 니 다. fork 함수 의 반환 값 부분 에 대한 설명 을 참조 하 십시오.
3. 함수 상세 설명:
1. 프로 세 스 를 만 드 는 목적
vfork 함 수 는 새 프로 세 스 를 만 드 는 데 사 용 됩 니 다. 새 프로 세 스 의 목적 은 새 프로그램 을 실행 하 는 것 입 니 다.
2. fork 함수 와 마찬가지 로 키 프로 세 스 를 만 듭 니 다.그러나 부모 프로 세 스 의 주소 공간 을 하위 프로 세 스 로 완전히 복사 하 지 는 않 습 니 다.하위 프로 세 스 가 exec 함 수 를 즉시 호출 하기 때문에 부모 프로 세 스 의 주소 공간 을 저장 할 필요 가 없습니다.
3. vfork 함수 가 만 든 하위 프로 세 스 에서 exec 를 호출 하기 전에 하위 프로 세 스 는 부모 프로 세 스 공간 에서 실 행 됩 니 다.따라서 하위 프로 세 스 는 부모 프로 세 스 와 더미, 스 택 을 공유 합 니 다. 하위 프로 세 스 에서 부모 프로 세 스 의 변 수 를 바 꾸 면 부모 프로 세 스 의 변수 값 이 변 경 됩 니 다. 다음 과 같 습 니 다.
#include <stdio.h>
#include <unistd.h>
int main()
{
int a = 9;
pid_t pid = -1;
if((pid = vfork()) < 0)
{
// ID ,
printf("vfork error!!
");
return -1;
}
else if(pid == 0)
{
// a , a
a++;
printf("child process: a = %d ppid = %d
",a,getppid());
_exit(0);
}
else
{
// a 。
printf("parent process: a = %d child_pid = %d
",a,pid);
}
return 0;
}
출력 결 과 는 다음 과 같 습 니 다.
child process: a = 10 ppid = 2893
parent process: a = 10 child_pid = 2894
위의 예 에서 우 리 는 부모 프로 세 스 에서 자동 변수 a 의 값 이 바 뀌 었 음 을 알 수 있다.
4. vfork 와 fork 사이 의 또 다른 차이 점:
앞에서 저희 가 말씀 드 렸 잖 아 요.
vfork 와 fork 사이 의 차이 점 (부모 프로 세 스 의 주소 공간 을 복사 할 지 여부).
vfork 와 fork 사이 의 또 다른 차 이 는...
vfork 는 하위 프로 세 스 가 먼저 실 행 될 수 있 도록 보장 합 니 다. exec 나 exit 를 호출 한 후에 야 부모 프로 세 스 가 실 행 될 수 있 습 니 다.이 함수 (exec, exit) 이전에 부모 프로 세 스에 의존 하 는 추가 동작 이 있다 면
자물쇠 가 죽다.
5. 하위 프로 세 스 에서 exit 의 사용
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LINUX 시리즈(1부)UNIX는 1969년 AT&T에서 개발한 운영 체제입니다. UNIX는 다중 사용자, 다중 프로세스 운영 체제입니다. 기본적으로 사용 가능한 두 가지 기본 UNIX 버전이 있습니다. 대부분의 UNIX 버전은 이러한 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.