프로세스 및 fork() 메서드

프로세스 및 fork() 메서드

저는 운영체제와 리눅스를 처음 접하는 사람이라 아주 기초적인 질문일지도 모르지만 답을 찾을 수 없습니다.

지금까지 읽은 자료에 따르면 이 fork()방법은 운영 체제에 대한 시스템 호출을 생성하여 새로운 프로세스를 생성합니다. 생성된 프로세스는 호출 프로세스의 정확한 복사본입니다.

하지만 생성된 프로세스(자식 프로세스)와 호출하는 프로세스(상위 프로세스)가 완전히 동일하지는 않다고 생각합니다. 상위 프로세스의 메서드 이전 코드는 fork()하위 프로세스에 복사되지 않습니다.

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void){
   X
   int child1 = fork();
   A
   B
   C
   D
   int child2 = fork();
   E
   F
   return 0; 
}

child2 프로세스에는 ABCD 코드 줄이 포함되어 있지 않지만 child1 프로세스에는 X를 제외한 모든 줄이 포함되어 있습니다. 사실 이건 내 생각이다. 반면에, 자식 프로세스는 부모 프로세스의 정확한 복사본이라고 어디에서나 알려져 있습니다.

어느 것이 사실인지 누가 알 수 있습니까?

답변1

fork()"두 번 돌아오세요". 상위 프로세스에서는 하위 프로세스의 PID를 반환합니다. 하위 프로세스에서는 0을 반환합니다. 이는 오류가 없다고 가정합니다. 즉, 코드를 두 번 분기하면 총 4개의 프로세스가 생성됩니다.

fork(2)( ) 에 설명된 방식을 제외하고 절차는 모든 면에서 동일합니다 man 2 fork.

예를 들어, 코드에서

while (1) {
   A
   B
   C
   fork();
}

A, 그리고 점점 더 많은 프로세스에 의해 실행될 것입니다(실제로 이와 같은 코드를 작성하지 B마십시오 C. 시스템이 잠길 수 있습니다).

귀하의 예에서 이러한 지침은 하위 프로세스에서도 실행되지만 이러한 지침을 반환하는 코드 경로는 없습니다. 하위 프로세스는 호출 당시 상위 프로세스와 동일하므로 fork()호출 코드에서 실행이 시작됩니다 fork().

관련 정보