포크 호출과 재귀

포크 호출과 재귀
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    fork();
    fork();
    fork();

    puts("hi");

    return 0;
}

프로그램은 "hi"를 8번 인쇄하고 종료됩니다. 왜? 모든 재귀 fork호출 은 main다음과 같습니다: f(): "hi"; f()?

답변1

아니요, fork"재귀"라는 전통적인 의미의 재귀가 아닙니다. 호출은 fork()현재 프로세스를 복사하므로 "두 번 반환"됩니다. 하위 프로세스의 경우 반환 값은 0이고 상위 프로세스의 경우 반환 값은 하위 PID입니다. fork()하다아니요재부팅 - 이것은 뒤에 오는 것과 main비슷합니다 .forkexec

이것이 귀하의 프로그램이 작동하는 방식입니다. 먼저 줄 번호를 삽입해 보겠습니다.

 1: #include <stdio.h>
 2: #include <stdlib.h>
 3: #include <string.h>
 4:
 5: int main(int argc, char *argv[])
 6: {
 7:    fork();
 8:    fork();
 9:    fork();
10:
11:    puts("hi");
12:
13:    return 0;
14: }

프로그램을 시작했고 해당 PID가 다음과 같다고 가정합니다..

  • 7행 이후 호출은 fork두 개의 별도 프로세스를 생성합니다.모두 8호선에, PID가 있는 1개(원본) 및 pidC1(새 아이).

  • 8행을 실행하고 PID를 사용하여 새 하위 프로세스를 생성합니다.C2. 둘 다그리고C2이제 9호선에 있습니다. 동시에,C18행을 실행하고 새 하위 프로세스를 생성합니다.CC1. 둘 다CC1그리고C19호선에도 있습니다. (완전히 연관되어 있지는 않지만, 위의 두 문장이 나타나는 순서는 정의되어 있지 않습니다. 다중 프로세서 시스템에서는 동시에 나타날 수 있습니다.)

이제 4가지 프로세스가 있습니다.,C1,C2, 그리고CC1. 보시다시피 fork프로세스 수가 연속해서 두 배로 늘어납니다. 3개의 호출이 있으므로 결국 2, 3 또는fork 8개의 프로세스가 생성됩니다 . 가계도는 다음과 같습니다.

P (initial process, started by you)
+-- C1 (created on line 7)
|   +-- CC1 (created on line 8)
|   |   +-- CCC1 (created on line 9)
|   +-- CC2 (created on line 9)
+-- C2 (created on line 8)
|   +-- CC3 (created on line 9)
+-- C3 (created on line 9)

각 프로세스는 트리의 상위 프로세스에 의해 생성됩니다.

답변2

                           main()
                             |
                             |
                      fork()  ------------------
                              |                 |
                     fork()   -------        -------
                              |     |        |      |
                   fork()   ----   ----     ---    ---
                            |  |   |   |    |  |   |  |

이것은 위 코드의 프로세스 트리이며, 이것이 fork()가 작동하는 방식입니다. 그리고 8이 인쇄되는 이유는 항상 2의 n제곱임을 의미합니다(여기서 n은 호출 횟수, 즉 fork()입니다.

관련 정보