programing

이 프로그램은 왜 "forked!"라고 4번 인쇄합니까?

kingscode 2022. 8. 18. 21:45
반응형

이 프로그램은 왜 "forked!"라고 4번 인쇄합니까?

이 프로그램은 왜 "forked!"라고 4번 인쇄합니까?

#include <stdio.h>
#include <unistd.h>

int main(void) {

  fork() && (fork() || fork());

  printf("forked!\n");
  return 0;
}

그 중 하나는main()fork().

세 가지 " " " 입니다.forks()실행됩니다.다음 참조 자료를 살펴보는 것이 좋습니다.

반환값

정상적으로 완료되면 fork()는 0을 자 프로세스에 반환하고 프로세스의 프로세스 ID를 부모 프로세스반환해야 합니다.두 프로세스 모두 fork() 함수에서 계속 실행됩니다.그렇지 않으면 -1을 부모 프로세스로 되돌리고 자식 프로세스를 생성해서는 안 되며 오류를 나타내도록 errno를 설정해야 합니다.

여기서 설명한 바와 같이 프로세스 ID는 0일 수 없습니다.


그럼 진짜 어떻게 되는 거야?

다음과 같은 것이 있습니다.

fork() && (fork() || fork());

첫 번째 ㅇㅇㅇㅇㅇㅇ'는fork()는 부모에게 0이 아닌 프로세스 ID를 반환하고 자녀 프로세스에는 0을 반환합니다.즉, 논리식의 첫 번째 포크는 부모 프로세스에서는 true로 평가되지만 자녀 프로세스에서는 false로 평가되며 Short circuit 평가로 인해 나머지 2개를 호출하지 않습니다.fork()s.

해서 두 의 인쇄물한장, 첫 에서 한 장)이 을 알 수 .fork()를 참조해 주세요.

이제 두 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네.fork()부모 프로세스에서는 실행되며 부모 프로세스에는 0이 아닌 값이 반환되고 자녀 프로세스에서는 0이 반환됩니다.

이제.fork()의 첫 자포크를 합니다.||0이 .

그 말은 우리가 두 장의 프린트를 더 받는다는 뜻이죠.

그 결과, 총 4장의 프린트가 취득되었습니다.


단락

여기서 단락이란 기본적으로 &&의 첫 번째 피연산자가 0일 경우 다른 피연산자는 평가되지 않는다는 것을 의미합니다.같은 논리로 ||의 피연산자가 1일 경우 나머지 피연산자는 평가가 필요하지 않습니다.이는 나머지 오퍼랜드가 논리식의 결과를 변경할 수 없기 때문에 실행할 필요가 없기 때문에 시간을 절약할 수 있기 때문입니다.

아래의 예를 참조해 주세요.


과정

상위 프로세스는 하위 프로세스를 생성하며, 하위 프로세스는 다른 프로세스 등을 생성합니다.이로 인해 프로세스 계층(또는 트리라고 할 수 있는 계층)이 형성됩니다.

이 점을 염두에 두고 이 답변과 마찬가지로 이와 유사한 문제를 살펴볼 필요가 있습니다.


설명 이미지

도움이 될 만한 피규어도 만들었죠.나는 pid가 pid가fork()콜마다 3, 4, 5가 반환됩니다.

포크 노드일부에 주의해 주세요.fork()s 위에 빨간색 X가 표시되어 있습니다.이것은 논리식의 단락 평가가 있기 때문에 실행되지 않는 것을 의미합니다.

fork()연산자의 첫 번째 피연산자가 실행되기 때문에 상단의 s는 실행되지 않습니다.&&따라서 식 전체가 0이 되므로 나머지 오퍼랜드 실행 시 에센스는 발생하지 않습니다.&&.

fork()하단의 피연산자는 두 번째 피연산자이므로 실행되지 않습니다.||여기서 첫 번째 피연산자는 0이 아닌 숫자이므로 두 번째 피연산자가 무엇이든 식 결과는 true로 평가됩니다.

다음 그림에서는 프로세스의 계층을 확인할 수 있습니다.프로세스 계층이전 그림을 바탕으로 합니다.


단락의 예

#include <stdio.h>

int main(void) {

  if(printf("A printf() results in logic true\n"))
    ;//empty body

  if(0 && printf("Short circuiting will not let me execute\n"))
    ;
  else if(0 || printf("I have to be executed\n"))
    ;
  else if(1 || printf("No need for me to get executed\n"))
    ;
  else
  printf("The answer wasn't nonsense after all!\n");

  return 0;
}

출력:

A printf() results in logic true
I have to be executed

첫 번째fork()는, 발신 프로세스(p0 라고 불립니다)에서 제로 이외의 값을 반환해, 자(p1 이라고 부릅니다)에서는0 을 반환합니다.

p1에서 의 단락은&&프로세스가 호출합니다.printf종료됩니다.p0에서는 공정이 나머지 식을 평가해야 합니다.그럼 전화해요fork()새로운 하위 프로세스(p2)를 만듭니다.

p0 p0 우 infork()아닌 하고 0의 을 반환한다.||호출됩니다.printf료됩니니다다

p2입니다.fork()의 나머지를 평가해야 0의 평가입니다.이것이 마지막입니다.fork()의 p2(p3)는 p2(p3)의 경우입니다.

다음 는 런음 음 、 P2 、 됩 p p p p p p p p p를 실행합니다.printf료됩니니다다

다음 는 다음음가 P3 。printf료됩니니다다

4 printf런음음하다

모든 다운보터에게 이것은 병합되었지만 다른 질문에서 나온 것입니다.SO를 탓하다.감사합니다.

문제를 세 줄로 분해할 수 있습니다. 첫 번째 줄과 마지막 줄은 모두 공정의 수를 두 배로 늘립니다.

fork() && fork() || fork();

연산자가 단락되어 있기 때문에 다음과 같이 표시됩니다.

       fork()
      /      \
    0/        \>0
 || fork()     && fork()
     /\            /   \
    /  \         0/     \>0
   *    *     || fork()  *
                /   \
               *     *

즉, 총 4 * 5 = 20개의 프로세스가 각각 한 줄씩 인쇄됩니다.

주의: 어떤 이유로 fork()가 실패하면(예를 들어 프로세스 수에 제한이 있는 경우), -1이 반환되고 다른 결과가 나타납니다.

" " "의 실행fork() && (fork() || fork()) , 「」

★★fork pid와 0의 .

첫 번째 포크:

  • null => 값은 null이 아닌 pid로 실행됩니다.&& (fork() || fork())
    • 두 이며, "pid not null" 은 "pid not null" 의 합니다.||= > = > 인쇄forked
    • 값 =0= > 두 번째 포크 자녀 값 = 0 = > > > > > > > > > > > > > > > > > > > > > > > >|| fork()
      • prints " " " " " " " " "forked
      • prints " " " " " " " " "forked
  • 0& & = > 자 child 、 0 child입입0 。 & & part = > 인쇄 실행을 중지합니다.forked

4 계:: 4forked

이미 제출된 답변은 모두 마음에 듭니다.printf 스테이트먼트에 변수를 몇 개 더 추가하면 무슨 일이 일어나고 있는지 쉽게 알 수 있을 것입니다.

#include<stdio.h>
#include<unistd.h>

int main(){

   long child = fork() && (fork() || fork());
   printf("forked! PID=%ld Child=%ld\n", getpid(), child);
   return 0;
}

제 기계에서는 다음과 같은 출력이 생성되었습니다.

forked! PID=3694 Child = 0
forked! PID=3696 Child = 0
forked! PID=3693 Child = 1
forked! PID=3695 Child = 1

다음 코드:

fork();
fork() && fork() || fork();
fork();

20개의 프로세스와 20배의 Printf를 얻을 수 있습니다.

그리고...

fork() && fork() || fork();

printf는 총 5회 동작합니다.

언급URL : https://stackoverflow.com/questions/26716255/why-does-this-program-print-forked-4-times

반응형