logo

C의 포크()

Fork 시스템 호출은 Linux 및 Unix 시스템에서 새로운 프로세스를 생성하는 데 사용됩니다. 하위 프로세스 , 이는 fork() 호출을 수행하는 프로세스(상위 프로세스)와 동시에 실행됩니다. 새로운 하위 프로세스가 생성된 후 두 프로세스 모두 fork() 시스템 호출에 이어 다음 명령을 실행합니다.

하위 프로세스는 상위 프로세스에서 사용하는 것과 동일한 pc(프로그램 카운터), 동일한 CPU 레지스터 및 동일한 열린 파일을 사용합니다. 매개변수를 사용하지 않으며 정수 값을 반환합니다.



다음은 fork()가 반환하는 다양한 값입니다.

  • 음수 값 : 하위 프로세스 생성에 실패했습니다.
  • : 새로 생성된 자식 프로세스로 돌아갑니다.
  • 양수 값 : 부모 또는 발신자에게 반환됩니다. 값에는 새로 생성된 하위 프로세스의 프로세스 ID가 포함됩니다.

포크 프로세스 생성

메모: fork()는 스레딩 기반 함수입니다. 올바른 출력을 얻으려면 로컬 시스템에서 프로그램을 실행하세요.



위 프로그램은 Windows 환경에서는 컴파일되지 않습니다.

C의 fork() 예




애플릿



#include> #include> #include> int> main()> {> > >// make two process which run same> >// program after this instruction> >pid_t p = fork();> >if>(p<0){> >perror>(>'fork fail'>);> >exit>(1);> >}> >printf>(>'Hello world!, process_id(pid) = %d '>,getpid());> >return> 0;> }>

>

>

산출

Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>

예제 2: hello가 인쇄되는 횟수를 계산합니다.




#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello '>);> >return> 0;> }>

>

>

산출

hello hello hello hello hello hello hello hello>

설명

'hello'가 인쇄되는 횟수는 생성된 프로세스 수와 같습니다. 총 프로세스 수 = 2N, 여기서 n은 포크 시스템 호출 횟수입니다. 따라서 여기서 n = 3, 2= 8 세 줄에 몇 가지 레이블 이름을 입력해 보겠습니다.

fork (); // Line 1 fork (); // Line 2 fork (); // Line 3 L1 // There will be 1 child process /  // created by line 1. L2 L2 // There will be 2 child processes /  /  // created by line 2 L3 L3 L3 L3 // There will be 4 child processes // created by line 3>

따라서 총 8개의 프로세스(새 하위 프로세스와 하나의 원본 프로세스)가 있습니다. 프로세스 간의 관계를 트리 계층 구조로 표현하려면 다음과 같습니다. 기본 프로세스: P0 첫 번째 포크에서 생성된 프로세스: P1 두 번째 포크에서 생성된 프로세스: P2, P3 세 번째 포크에서 생성된 프로세스: P4, P5, P6, P7

 P0 / |  P1 P4 P2 /   P3 P6 P5 / P7>

예시 3: 다음 프로그램의 출력을 예측합니다.




#include> #include> #include> #include> void> forkexample()> {> >pid_t p;> >p = fork();> >if>(p<0)> >{> >perror>(>'fork fail'>);> >exit>(1);> >}> >// child process because return value zero> >else> if> ( p == 0)> >printf>(>'Hello from Child! '>);> > >// parent process because return value non-zero.> >else> >printf>(>'Hello from Parent! '>);> }> int> main()> {> >forkexample();> >return> 0;> }>

>

>

산출

Hello from Parent! Hello from Child!>

메모: 위 코드에서는 하위 프로세스가 생성됩니다. fork()는 자식 프로세스에서는 0을 반환하고 부모 프로세스에서는 양의 정수를 반환합니다. 여기서는 상위 프로세스와 하위 프로세스가 동시에 실행 중이므로 두 가지 출력이 가능합니다. 따라서 OS가 먼저 상위 프로세스 또는 하위 프로세스에 제어권을 부여할지 알 수 없습니다.

상위 프로세스와 하위 프로세스가 동일한 프로그램을 실행하고 있지만 이것이 동일하다는 의미는 아닙니다. OS는 이 두 프로세스에 서로 다른 데이터와 상태를 할당하며 이러한 프로세스의 제어 흐름도 다를 수 있습니다. 다음 예를 참조하세요.

예시 4: 다음 프로그램의 출력을 예측합니다.




Excel에서 첫 번째 문자를 제거하는 방법

#include> #include> #include> #include> > void> forkexample()> {> >int> x = 1;> >pid_t p = fork();> >if>(p<0){> >perror>(>'fork fail'>);> >exit>(1);> >}> >else> if> (p == 0)> >printf>(>'Child has x = %d '>, ++x);> >else> >printf>(>'Parent has x = %d '>, --x);> }> int> main()> {> >forkexample();> >return> 0;> }>

>

>

산출

Parent has x = 0 Child has x = 2>

또는

그렇지 않으면 자바에서 루프가 발생합니다.

산출

Child has x = 2 Parent has x = 0>

여기서 한 프로세스의 전역 변수 변경은 두 프로세스의 데이터/상태가 다르기 때문에 다른 두 프로세스에 영향을 미치지 않습니다. 또한 부모와 자식이 동시에 실행되므로 두 가지 출력이 가능합니다.

포크() 대 exec()

포크 시스템 호출은 새로운 프로세스를 생성합니다. fork()에 의해 생성된 새 프로세스는 반환된 값을 제외하고 현재 프로세스의 복사본입니다. 반면 exec() 시스템 호출은 현재 프로세스를 새 프로그램으로 대체합니다.

C 포크() 기반 문제

1. 프로세스는 다음 코드를 실행합니다.




for> (i = 0; i fork();>

>

>

생성된 하위 프로세스의 총 개수는 다음과 같습니다. (GATE-CS-2008)

(A) 엔
(B) 2^n – 1
(다) 2^n
(D) 2^(n+1) – 1

해결책은 이것을 참조하십시오.

2. 다음 코드 조각을 고려하십시오.




마크다운 각주

if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d '>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d '>, a, &a);> }>

>

>

u, v를 상위 프로세스에 의해 인쇄된 값이고 x, y가 하위 프로세스에 의해 인쇄된 값이라고 가정합니다. 다음 중 어느 것이 사실인가요? (GATE-CS-2005)

(A) u = x + 10 및 v = y
(B) u = x + 10 및 v != y
(C) u + 10 = x 및 v = y
(D) u + 10 = x 및 v != y

해결책은 이것을 참조하십시오.

3. 아래 프로그램의 출력을 예측해 보세요.




#include> #include> int> main()> > >fork();> >fork() && fork()>

>

>

해결책은 이것을 참조하세요

관련 기사 :

  • 포크()와 파이프()를 시연하는 C 프로그램
  • C의 좀비 및 고아 프로세스
  • fork() 및 이를 사용하여 생성된 메모리 공유 흑백 프로세스