programing

For Loop의 fork()에 대해 시각적으로 표시되는 동작

copysource 2022. 8. 10. 21:04
반응형

For Loop의 fork()에 대해 시각적으로 표시되는 동작

나는 행동을 이해하려고 노력해왔다.이번에는for-loop 하십시오.

#include <stdio.h>

void main()
{
   int i;

   for (i=0;i<3;i++)
   {
      fork();

      // This printf statement is for debugging purposes
      // getppid(): gets the parent process-id
      // getpid(): get child process-id

      printf("[%d] [%d] i=%d\n", getppid(), getpid(), i);
   }

   printf("[%d] [%d] hi\n", getppid(), getpid());
}

출력은 다음과 같습니다.

[6909][6936] i=0
[6909][6936] i=1
[6936][6938] i=1
[6909][6936] i=2
[6909][6936] hi
[6936][6938] i=2
[6936][6938] hi
[6938][6940] i=2
[6938][6940] hi
[1][6937] i=0
[1][6939] i=2
[1][6939] hi
[1][6937] i=1
[6937][6941] i=1
[1][6937] i=2
[1][6937] hi
[6937][6941] i=2
[6937][6941] hi
[6937][6942] i=2
[6937][6942] hi
[1][6943] i=2
[1][6943] hi

나는 매우 시각적인 사람이기 때문에 사물을 진정으로 이해하는 유일한 방법은 그림을 그리는 것입니다.선생님께서 8개의 hi 스테이트먼트가 있을 거라고 하셨어요.코드를 작성해서 실행했는데 8개의 hi 스테이트먼트가 있었습니다.하지만 난 정말 이해하지 못했어.그래서 저는 다음과 같은 그림을 그렸습니다.

여기에 이미지 설명 입력

의견을 반영하기 위해 다이어그램이 업데이트되었습니다. : )

관찰:

  1. 부모 프로세스(메인)는 루프를 3회 반복해야 합니다.그러면 printf가 호출됩니다.
  2. 부모 for-loop을 반복할 때마다 fork()가 호출됩니다.
  3. 각 fork() 호출 후 i가 증가하므로 모든 자녀가 증가하기 전에 i에서 for-loop을 시작합니다.
  4. 각 for-loop의 마지막에 "hi"가 인쇄됩니다.

다음은 질문입니다.

  • 제 다이어그램이 맞습니까?
  • 왜 두 가지 인스턴스가 있는 거죠?i=0력에대??? ??
  • 의 치 ifork() 뒤에 각 자녀에게 인계됩니까? 인 경우i월 " 、 " " 、 포포 、 포포 、 포은?
  • 항상 그런가요?2^n - 1분기된 아이들의 수를 셀 수 있는 방법일까요? 여기 ,, 기n=3즉,2^3 - 1 = 8 - 1 = 7이들, 어떤??

은 ''부터요.forloopsyslog.syslog..syslog.

  1. 부모로부터 됩니다.i == 0

  2. ★★fork() 1.s, "1 입니다.

  3. 이제 두 가지 프로세스가 있습니다. 다 인쇄 ★★★★★i=0.

  4. 루프가 루프가 재기동됩니다.i == 1.

  5. 와 1fork()2시 3분이다.

  6. 4번입니다. 모두 인쇄 4매i=1.

  7. 루프가 이 시점에서 4개의 프로세스가 재기동됩니다.i == 2.

  8. 와 ~ 3 。fork()7.4세까지를

  9. 8시 정각 인쇄 ★★★★★★★★★★★★★★★★★▼i=2.

  10. 프로세스 되며, 는 8개의 프로세스로 재기동됩니다.i == 3.

  11. 모든 됩니다(「8」).i < 3더 이상 사실이 아닙니다.

  12. 의 모든 가 8개의 프로세스를 인쇄합니다.hi.

  13. 8개의 프로세스가 모두 종료됩니다.

해서 ,, 신, 신, 신, 당, so, so, so, so, so, so.0번 하다.1, 4회 인쇄,2, 8회 인쇄,hi8월 8일

질문에 하나씩 답하려면:

제 다이어그램이 맞습니까?

네, 기본적으로요.그것도 아주 좋은 그림이에요.

'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, .i=0전체 루프 반복을 나타내는 라벨.하지만 이 도표에서 알 수 없는 은 각각 다음 단계입니다.fork()중 " " " 뒤에 fork()콜은 분기된 자 프로세스에서도 실행됩니다.

의 가 2개 입니까?i=0력에대??? ??

은 ★★★★★★★★★★★★★★★★★★★★★★★★.printf()fork()부모 프로세스와 막 분기된 자식 프로세스 모두에 의해 실행됩니다.「 」를 하면,printf()before fork()부모만 실행합니다(자녀 프로세스가 아직 존재하지 않기 때문입니다.

의 치 i됩니다.fork()i월 " 、 " " 、 포포 、 포포 、 포은?

「」의 값i에 의해 .fork()따라서 자녀 프로세스는 부모 프로세스와 동일한 값을 인식합니다.

fork()한 번 호출되지만 두 번 반환됩니다. 부모 프로세스에서 한 번 반환되고 새로 복제된 자식 프로세스에서 한 번 반환됩니다.

보다 간단한 예로서 다음 코드를 고려합니다.

printf("This will be printed once.\n");
fork();
printf("This will be printed twice.\n");
fork();
printf("This will be printed four times.\n");
fork();
printf("This will be printed eight times.\n");

에 의해 된 자 fork()는 부모의 (거의) 완전 클론입니다.따라서 자체적인 관점에서 부모 프로세스의 모든 상태(모든 변수 값, 콜스택 및 실행 중인 명령 포함)를 상속하는 부모 프로세스의 "상호"가 됩니다.차이(「」에 의해 반환된 등의 메타데이터 )getpid()는 )의 입니다.fork()(자녀 프로세스에서는 제로가 되지만 부모 프로세스에서는 제로가 아닌 아이디폴더 프로세스에서는 0이 됩니다.

항상 그런가요?2^n - 1분기된 아이들의 수를 셀 수 있는 방법일까요? 여기 ,, 기n=3즉,2^3 - 1 = 8 - 1 = 7이들, 어떤??

" " " 를 fork() 상태, 즉 2개의 에러 상태가 있는 합니다).fork()에러가 발생할 수 있습니다.가 같은를 계속 fork()또는 자신의 프로세스 ID를 기반으로 다른 코드 경로로 분기합니다. 그러면 이후의 각 포크는 프로세스 수를 두 배로 늘립니다.네, 포크 세 개 후에는 총 2µ=8개의 공정으로 끝납니다.

  1. 네, 맞습니다.(아래 참조)
  2. 아요 no요 。i++콜 후에 실행됩니다.fork 때문입니다for루프가 동작합니다.
  3. 모든 것이 성공적으로 진행된다면, 네. 이 경우 주의해 .fork실패할 수 있습니다.

두 번째에 대한 간단한 설명:

for (i = 0;i < 3; i++)
{
   fork();
}

는 다음과 같습니다.

i = 0;
while (i < 3)
{
    fork();
    i++;
}

★★★★★★★★★★★★★★★★★.i갈림길은 ,, 음, 음, 음, 음, 후, 후의 직후에 됩니다.fork()그래서 제 생각에는 그림이 맞는 것 같습니다.

언급URL : https://stackoverflow.com/questions/26793402/visually-what-happens-to-fork-in-a-for-loop

반응형