문제
다음 C 프로그램의 결과를 알려야합니다.
main()
{
int pid, k, som;
som = 0; k = 2;
pid = fork();
if(pid == 0)
k=5;
else
wait(0);
for(int i = 1; i <= k; i++)
som += i;
printf("%d", som);
}
첫 번째 기대는 3입니다. 포크 호출이 이루어지면 프로세스의 기억이 복사되고 두 프로그램이 모두 실행됩니다. 아동 프로세스는 실행되지만 K는 여전히 2와 같습니다. 따라서 마지막에는 1 + 2 = 3을 실행합니다.
그러나이 프로그램이 실행되면 153을 출력합니다. 왜 가장 가까운 단서가 없었는지 그 이유는 무엇입니까?
누구든지 왜 그런지 말할 수 있습니까?
해결책
그 이유는 동일한 콘솔로 인쇄되는 2 개의 프로세스가있는 이유입니다. "Fork"는 Unix/Linux 명령으로 한 번 호출되어 두 번 돌아옵니다. 반품 중 하나는 포크를 불렀던 원래 과정에 있으며 스폰 된 아동 프로세스의 PID를 반환합니다. 두 번째 반품은 0이고 이것은 자식 과정임을 나타냅니다.
프로그램 중 하나 인 내가 믿는 어린이는 먼저 실행하고 15를 값으로 계산하고 마지막으로 콘솔에 인쇄합니다. 부모 프로그램은 대기 (0)로 인해 두 번째로 실행되고 값 3을 생성합니다.
다른 팁
15
어린이에 의해 인쇄됩니다 3
부모에 의해.
A는 부모이고 B는 자녀입니다. 여기에 중요한 줄은 다음과 같습니다.
A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3
값 사이에 Newline이 인쇄되지 않으므로 자녀의 답변 직후에 부모의 대답이 나타납니다.
Jared는 값의 원인에 대해 정확합니다.
제휴하지 않습니다 StackOverflow