L010 Linux 와 androidNDK 의 linux 는 좀 비 프로 세 스 를 피하 고 하위 프로 세 스 는 종료 합 니 다.

5219 단어
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         

참조 링크
  • 포크 에서 나 온 하위 프로 세 스 를 비동기 로 회수 합 니 다
  • 좋은 웹페이지 즐겨찾기