fork 와 vfork (미 완성, 매일 업데이트 중...)

1. fork 시스템 호출
1. 함수 의 설명:
#include <unistd.h>

pid_t fork(void);

2. 반환 값:
    fork 함수 가 한 번 호출 되면 두 번 반 환 됩 니 다. (주 프로 세 스 가 새로 만 든 하위 프로 세 스 의 프로 세 스 ID 를 되 돌려 주 고, 하위 프로 세 스에 되 돌려 주 는 것 은 0 입 니 다.)프로 세 스 생 성 에 실 패 했 을 때 fork 반환 값 은 - 1 입 니 다.
  • 부모 프로 세 스 종 류 는 여러 개의 키 프로 세 스 가 있 을 수 있 지만 모든 하위 프로 세 스 의 프로 세 스 ID 를 얻 을 수 있 는 함수 가 없 기 때문에 포크 호출 을 통 해 새로 만 든 프로 세 스 의 프로 세 스 ID 를 주 프로 세 스에 되 돌려 줍 니 다.
  • 프로그램 에서 만 든 프로 세 스 의 프로 세 스 ID 가 0 일 수 없고 프로 세 스 ID 가 마이너스 가 아 닌 것 을 알 기 때문에 후속 코드 에서 현재 프로 세 스 가 주 프로 세 스 인지 새로 만 든 하위 프로 세 스 인지 구분 하기 위해 서 는 반환 값 을 통 해 구분 해 야 합 니 다. 따라서 fork 는 하위 프로 세 스에 서 0 을 되 돌려 줍 니 다.

  • 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 의 두 가지 용법:
  • 부모 프로 세 스 는 자신 이 복 사 를 받 기 를 원 하고 부자 프로 세 스 가 서로 다른 프로그램 을 동시에 실행 하도록 한다. 이것 은 네트워크 프로 그래 밍 에서 흔히 볼 수 있 는 것 이다.예 를 들 어 부모 프로 세 스 는 클 라 이언 트 의 연결 요청 을 기다 리 고 있 습 니 다.요청 이 도 착 했 을 때 부모 프로 세 스 는 fork 를 호출 하여 하위 프로 세 스 가 방금 도착 한 요청 을 처리 하고 부모 프로 세 스 는 다음 요청 이 도착 하 기 를 계속 기다 리 고 있 습 니 다.
  • 하나의 프로 세 스 가 서로 다른 프로그램 을 실행 해 야 합 니 다. 이것 은 셸 에 게 흔히 볼 수 있 습 니 다.하위 프로 세 스 가 fork 에서 돌아 온 후 즉시 exec 를 호출 합 니 다.

  • 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 의 사용

    좋은 웹페이지 즐겨찾기