목표:좀비 프로세스 또는 소멸 프로세스가 생성되는 방법과 프로세스 테이블에서 제거하는 방법을 분석합니다.
좀비 프로세스 또는 소멸 프로세스는 실행을 완료했지만 여전히 프로세스 테이블에 항목이 있는 프로세스입니다. 이는fork()
시스템 호출을 사용하여 부모 프로세스에 의해 포크되었지만wait()
시스템 호출을 사용하여 부모 프로세스에 의해 수확되지 않은 자식 프로세스에 대해 발생합니다.
부모 프로세스는 자식 프로세스가 종료된 후 자식 프로세스의 종료 상태를 가져오기 위해wait()
(또는waitpid()
)시스템 호출을 수행해야 합니다. wait()
호출이 부모 프로세스에 의해 수행되지 않으면 자식 프로세스가 좀비 프로세스가 됩니다.
SIGCHLD
신호는 자식 프로세스가 종료될 때마다 부모 프로세스로 전송됩니다. 부모 프로세스에는wait()
에 대한 호출로 정의된SIGCHLD
신호 처리기 함수가 있어야 합니다.
시스템에서 좀비 프로세스를 제거하기 위해kill
명령을 사용하여SIGCHLD
신호를 수동으로 부모에게 보낼 수 있습니다. 부모 프로세스가 여전히 좀비 프로세스를 거두기를 거부하고 부모 프로세스가 종료 될 수 있다면 다음 단계는 부모 프로세스를 종료하는 것입니다. 자식 프로세스가 부모 프로세스를 잃으면init
가 새 부모가 됩니다. init
는wait()
시스템 호출을 주기적으로 실행하여init
를 부모로 사용하는 모든 좀비 프로세스를 가져옵니다.
좀비 프로세스를 만드는 간단한 프로그램을 작성했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#4372 를 포함하십시오.1998 년>
#4372>를 포함하십시오.1998 년>
#다음은 다음과 같습니다.1998 년>
#4372>시스템/대기를 포함하십시오.1998 년>
#<를 포함하십시오.1998 년>
#<를 포함하십시오.>
()
{
이 문제를 해결하기 위해 몇 가지 방법이 있습니다.;
> 0) {
// 부모 프로세스가 30 초 동안 절전 모드로 전환되고 종료되며 대기 호출이 없습니다()
());
수면(30);
종료(0);
}
다른 경우== 0) {
// 자식 프로세스가 즉시 종료됩니다에서
());
종료(0);
}
다른 경우== -1) {
// 이 문제를 해결하는 데 도움이되는 몇 가지 방법이 있습니다.;
}
else{
//이 발생하지 않아야
fprintf(stderr,”알 수 없는 반환 값의%d fork()호출”,child_pid);
구(-2);
}
return0;
}
|
저장로 위의 코드를zombie.c
컴파일을 사용하여gcc
.
$ gcc zombie.c -o zombie
다음으로 프로그램을 실행하십시오.
$ ./zombie parent process - 26570child process - 26571
다른 터미널에서ps
을 수행하여 실행중인 프로세스를 표시합니다. 당신은 좀비 과정을 볼 수 있습니다.
$ ps -ef | grep zombieibrahim 26570 22886 0 15:59 pts/2 00:00:00 ./zombieibrahim 26571 26570 0 15:59 pts/2 00:00:00 <defunct>
부모 프로세스가 종료되면(30 초 후)init
프로세스에 의해 프로세스 테이블에서 좀비 프로세스가 제거됩니다.
모하메드 이브라힘
이브라힘은 이브라힘,리눅스,안드로이드,오픈소스,리버스엔지니어링,코딩소스,자바,자바스크립트,노드엔지니어링,리액트,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑,리눅스데스크탑