주어진 코드 예제는 다음과 같습니다.
# include <stdio.h>
# include <unistd.h>
void main() {
static char *mesg[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
int display(char *), i;
for (i=0; i<10; ++i)
display(mesg[i]);
sleep(2);
}
int display(char *m) {
char err_msg[25];
switch (fork()) {
case 0:
execlp("/bin/echo", "echo", m, (char *) NULL);
sprintf (err_msg, "%s Exec failure", m);
perror(err_msg); return(1);
case -1:
perror ("Fork failure"); return(2);
default:
return(0);
}
}
이제, 이 프로그램을 실행하기 전 나의 가정은 부모가 자식보다 먼저 끝낼 것이라는 것이었습니다. 그래서 내 예상 결과는 다음과 같습니다.
0
1
2
3
4
5
6
7
8
9
그러나 프로그램을 실행할 때마다 프로세스 순서가 무작위로 지정됩니다. 내 질문은 "왜?"입니다. 프로세서가 프로세스 간에 점프하는 "컨텍스트 스위치" 때문입니까? 일부 프로세스는 다른 프로세스보다 더 많은 "리소스 할당"을 얻습니까? 상위 프로세스와 하위 프로세스의 순서는 변경할 수 없나요? 이것이 좀비 프로세스와 고아 프로세스가 있는 이유입니까?
답변1
fork() 하위 프로세스가 실행을 시작하자마자 실제로는 "시작"조차 하지 않고 상위 프로세스와 마찬가지로 fork() 호출 이후 코드에서 계속 실행됩니다. fork()의 반환값만 다릅니다. 부모와 자녀는 순서에 상관없이 나갈 수 있습니다. 그렇습니다. 컨텍스트 전환으로 인해 모든 프로세스가 무작위로 실행됩니다.
하위 프로세스가 종료되고 상위 프로세스가 하위 프로세스 종료 코드를 올바르게 "가져오지" 않으면 좀비 프로세스가 발생합니다. 좀비 프로세스에는 기본적으로 아직 검색되지 않은 종료 코드가 포함되어 있어 이를 볼 때마다 부주의한 상위 프로세스를 비난합니다. (좀비는 부모 프로세스가 수명이 짧고 관리가 필요하지 않는 한 부모 프로세스의 버그입니다.) 부모 프로세스가 자식 프로세스보다 먼저 종료되면 자식 프로세스는 PID 1로 재설정되어 종료를 수행합니다. 코드 수확. (이 과정에서 좀비도 제거됩니다.)