이 예를 보면
#include <stdio.h>
#include <unistd.h>
void main(){
int pi_d ;
int pid ;
pi_d = fork();
if(pi_d == 0){
printf("Child Process B:\npid :%d\nppid:%d\n",getpid(),getppid());
}
if(pi_d > 0){
pid = fork();
if(pid > 0){
printf("\nParent Process:\npid:%d\nppid :%d\n",getpid(),getppid());
}
else if(pid == 0){
printf("Child Process A:\npid :%d\nppid:%d\n",getpid(),getppid());
}
}
}
나에게 이것은 프로세스를 분기할 때 상위 프로세스의 복사본이 생성되기 때문에 프로세스를 무한정 생성하는 것처럼 보입니다. 이런 방식으로 프로그램 코드가 복제됩니다.
이는 각각의 새로운 프로세스가 동일한 코드를 실행하므로 pi_d = fork()
등을 호출한다는 것을 의미합니다.
내가 여기서 무엇을 놓치고 있는 걸까요?
답변1
에서 인용POSIX 포크 정의(굵은 강조 내):
반환 값
성공적으로 완료되면, fork()는 자식 프로세스에 0을 반환하고 부모 프로세스에 자식 프로세스의 프로세스 ID를 반환합니다.
fork()
두 프로세스 모두 이 함수에서 계속 실행되어야 합니다.. 그렇지 않으면 -1이 상위 프로세스에 반환되어야 하며 하위 프로세스는 생성되지 않으며errno
오류를 나타내도록 설정되어야 합니다.
OP는 다음과 같이 썼습니다.
이는 모든 새로운 프로세스에 대해 동일한 코드를 실행한다는 것을 의미합니다.
무사히 마치고 fork()
돌아온 후부모와 자녀는 즉시 회복됩니다fork()
:첫 번째 항목은 다시 실행되지 않으며 fork()
, 첫 번째나 두 번째 항목도 다시 실행되지 않습니다. fork()
이 코드에는 이러한 일이 발생하도록 하는 루프가 없기 때문입니다.
오류가 발생하지 않았다고 가정합니다(검사 없음).
- 상위 포크
- 서브 모니터인 경우
Child Process B
. - 그렇지 않고 부모라면 다시 포크하세요.
- (다시) 부모인 경우 표시
Parent Process
- 부모의 두 번째 자식인 경우 다음이 표시됩니다.
Child Process A
- (다시) 부모인 경우 표시
- 서브 모니터인 경우
정확한 실행 순서에서 하위 항목 또는 상위 항목 중 어느 하나가 다른 항목을 이길 것이라는 보장이 없기 때문에 3개의 출력은 어떤 순서나 혼합으로도 발생할 수 있습니다(그러나 특정 운영 체제에서는 하나의 표시 순서가 다른 것보다 커야 합니다). 표시 순서가 더 자주 발생하며 Child Process B
리드가 있는 순서가 먼저 표시될 수 있습니다.