#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
비슷합니다 .fork
exec
이것이 귀하의 프로그램이 작동하는 방식입니다. 먼저 줄 번호를 삽입해 보겠습니다.
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()입니다.