L010 Linux 와 androidNDK 의 linux 는 좀 비 프로 세 스 를 피하 고 하위 프로 세 스 는 종료 합 니 다.
프로그램 에서 하위 프로 세 스 를 만 들 고 하위 프로 세 스 가 종 료 된 후 관련 사항 을 잘 처리 하지 않 으 면 전설 적 인 프로 세 스 계 의 좀 비 - 좀 비 프로 세 스 를 소환 할 수 있 습 니 다!!
좀 비 프로 세 스 가 뭐야?
하나의 프로 세 스 가 exit 명령 을 호출 하여 자신의 생명 을 끝 낼 때 실제 좀 비 프로 세 스 에 의 해 소각 되 지 않 고 좀 비 프로 세 스 (Zombie) 라 는 데이터 구 조 를 남 깁 니 다. (시스템 은 exit 를 호출 합 니 다. 프로 세 스 를 종료 시 키 는 역할 을 하지만 정상 적 인 프로 세 스 를 좀 비 프로 세 스 로 만 드 는 것 에 국한 되 어 완전히 소각 할 수 없습니다)
좀 비 프로 세 스 가 어떻게 생 겼 는 지
Linux 프로 세 스 의 상태 에서 좀 비 프로 세 스 는 매우 특수 한 것 입 니 다. 거의 모든 메모리 공간 을 포 기 했 습 니 다. 실행 가능 한 코드 도 없고 스케줄 링 도 할 수 없습니다. 프로 세 스 목록 에 하나의 위 치 를 유지 하고 프로 세 스 의 종료 상 태 를 기록 하 는 등 정 보 를 수집 할 수 있 습 니 다. 그 밖 에 좀 비 프로 세 스 는 더 이상 메모리 공간 을 차지 하지 않 습 니 다.시 체 를 수습 하기 위해 서 는 아버지 프로 세 스 가 필요 합 니 다.
만약 에 그의 부모 프로 세 스 가 SIGCHLD 신호 처리 함 수 를 설치 하지 않 고 wait 나 waitpid () 를 호출 하여 하위 프로 세 스 가 끝 날 때 까지 기다 리 고 이 신 호 를 무시 하지 않 았 다 면 좀 비 상 태 를 유지 할 것 입 니 다. 이때 부모 프로 세 스 가 끝나 면 init 프로 세 스 는 자동 으로 이 자 리 를 인수 하여 시 체 를 수습 할 수 있 습 니 다.
그러나 부모 프로 세 스 가 하나의 순환 이 고 끝나 지 않 는 다 면 하위 프로 세 스 는 좀 비 상 태 를 유지 할 것 이다. 이것 이 바로 시스템 에 가끔 좀 비 프로 세 스 가 많은 이유 이다.시스템 이 사용 할 수 있 는 프로 세 스 번 호 는 제한 되 어 있 습 니 다. 경직 된 프로 세 스 가 대량으로 발생 하면 사용 가능 한 프로 세 스 번호 가 없어 서 시스템 에 새로운 프로 세 스 가 생 길 수 없습니다.
비동기 회수 좀 비 프로 세 스:
포크 () 이후, 하위 프로 세 스 는 부모 프로 세 스에 서 복사 본 을 가 져 왔 습 니 다. 부모 프로 세 스 와 각각 독립 적 으로 실행 되 었 습 니 다. 좀 비 프로 세 스 의 발생 은 부모 프로 세 스 가 자식 프로 세 스에 '시 체 를 수습' 하지 않 았 기 때 문 입 니 다. 또한 위해 정도 에 따라 다음 과 같은 두 가지 로 나 눌 수 있 습 니 다. 전체적으로 말 하면, 자식 프로 세 스 가 끝 난 후에, 부모 프로 세 스 가 끝나 지 않 을 때 까지 하위 프로 세 스 는 좀 비 프로 세 스 가 될 것 입 니 다(1) 하위 프로 세 스 가 끝 난 후에 부모 프로 세 스 가 끝나 기 전에 하위 프로 세 스 는 좀 비 프로 세 스 가 되 고 부모 프로 세 스 가 끝 난 후에 좀 비 는 init 프로 세 스 에 의 해 회 수 됩 니 다.(2) 자식 프로 세 스 가 끝 났 지만 아버지 프로 세 스 가 끝나 지 않 았 다 면 이 좀 비 는 계속 존재 할 것 이 고 exec 에 따라 좀 비가 점점 많아 질 것 이다.
회수 프로 세 스 함수
#include
#include
pid_t waitpid(pid_t pid,int * status,int options);
pid_t wait (int * status);
그 중 wait (& status);waitpid (- 1, & status, 0) 와 같 음;
waitpid () 는 현재 프로 세 스 의 실행 을 잠시 중단 합 니 다. 신호 가 오 거나 하위 프로 세 스 가 끝 날 때 까지 waitpid () 를 호출 할 때 하위 프로 세 스 가 끝 났 으 면 waitpid () 는 하위 프로 세 스 종료 상태 값 을 즉시 되 돌려 줍 니 다.하위 프로 세 스 의 종료 상태 값 은 매개 변수 status 에서 되 돌아 오고 하위 프로 세 스 의 프로 세 스 식별 코드 도 함께 돌아 갑 니 다.종료 상태 값 에 신경 쓰 지 않 으 면 인자 status 를 NULL 로 설정 할 수 있 습 니 다.인자 pid 는 기다 리 고 싶 은 하위 프로 세 스 식별 코드 입 니 다. 다른 수치 의 미 는 다음 과 같 습 니 다.
pid0 pid 。
매개 변수 options 는 waitpid 를 제어 하기 위해 추가 옵션 을 제공 합 니 다. 매개 변수 option 은 0 또는 "|" 연산 자 를 연결 하여 사용 할 수 있 습 니 다.
#include
#include
#include
#include
#include
void handler(int num) {
// SIGCHLD
int status;
int pid = waitpid(-1, &status, WNOHANG);
if (WIFEXITED(status)) {
printf("The child %d exit with code %d
", pid, WEXITSTATUS(status));
}
}
int main() {
// pid
int c_pid;
int pid;
signal(SIGCHLD, handler);
if ((pid = fork())) {
//
c_pid = pid;
printf("The child process is %d
", c_pid);
// , ~
int i=0;
for ( i = 0; i < 16; i++) {
printf("Do parent things.
");
sleep(1);
}
printf("Do parent end
");
exit(0);
} else {
//
printf("I 'm a child.
");
sleep(2);
exit(0);
}
}
하위 프로 세 스 의 종료 상태
WIFEXITED/WEXITSTATUS/WIFSIGNALED
If the exit status value (*note Program Termination::) of the child
process is zero, then the status value reported by `waitpid' or `wait'
is also zero. You can test for other kinds of information encoded in
the returned status value using the following macros. These macros are
defined in the header file `sys/wait.h'.
-- Macro: int WIFEXITED (int STATUS)
This macro returns a nonzero value if the child process terminated
normally with `exit' or `_exit'.
-- Macro: int WEXITSTATUS (int STATUS)
If `WIFEXITED' is true of STATUS, this macro returns the low-order
8 bits of the exit status value from the child process. *Note
Exit Status::.
-- Macro: int WIFSIGNALED (int STATUS)
This macro returns a nonzero value if the child process terminated
because it received a signal that was not handled. *Note Signal
Handling::
하위 프로 세 스 의 종료 상태 가 돌아 온 후 status 에 저 장 됩 니 다. 다음 매크로 는 종료 상황 을 판별 할 수 있 습 니 다.
WIFEXITED(status) 0 。
WEXITSTATUS(status) exit() , WIFEXITED 。
WIFSIGNALED(status)
WTERMSIG(status) , WIFSIGNALED 。
WIFSTOPPED(status) 。 WUNTRACED 。
WSTOPSIG(status) , WIFSTOPPED 。
kill -STOP 1234 。
kill -CONT 1234
참조 링크
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.