링크 ux 운영 체제 프로 세 스 하위 프로 세 스 회수

5517 단어
회수 서브 프로 세 스 는 주로 두 가지 함수 가 있 습 니 다: wait (), waitpid ().프로 세 스 가 종 료 될 때 모든 파일 설명 자 를 닫 고 사용자 공간 에 분 배 된 메모 리 를 방출 합 니 다. 그러나 PCB 는 아직 남아 있 습 니 다. 커 널 은 일부 정 보 를 저장 하고 있 습 니 다. 정상 적 인 종료 라면 종료 상 태 를 저장 하고 이상 종료 라면 이 진행 이 종 료 된 신 호 를 저장 하고 있 습 니 다.이 프로 세 스 의 부모 프로 세 스 는 wait 나 waitpid 를 호출 하여 이 정 보 를 가 져 온 다음 이 프로 세 스 를 완전히 지 울 수 있 습 니 다.프로 세 스 의 종료 상태 가 셸 에서 특수 변 수 를 사용 할 수 있 음 을 알 고 있 습 니 다 $?셸 이 부모 프로 세 스 이기 때문에 종료 할 때 셸 이 wait 나 waitpid 를 호출 하여 종료 상 태 를 얻 는 동시에 이 프로 세 스 를 완전히 제거 합 니 다.
wait 함수 부모 프로 세 스 가 wait 함 수 를 호출 하면 하위 프로 세 스 종료 정 보 를 회수 할 수 있 습 니 다.이 함 수 는 세 가지 기능 이 있 습 니 다.
① (부 프로 세 스) 하위 프로 세 스 가 종료 되 기 를 기다 리 는 것 을 막 습 니 다 ② 하위 프로 세 스 잔류 자원 회수 ③ 하위 프로 세 스 종료 상태 가 져 오기 (종료 원인).
pid_t wait(int *status); 성공: 삭 제 된 하위 프로 세 스 ID;실패: - 1 (하위 프로 세 스 없 음)
프로 세 스 가 종 료 될 때 운영 체제 의 암시 적 회수 체 제 는 1. 모든 파일 설명 자 를 닫 습 니 다. 2. 사용자 공간 에서 분 배 된 메모 리 를 방출 합 니 다.커 널 의 PCB 는 여전히 존재 한다.이 프로 세 스 의 종료 상 태 를 저장 합 니 다.(정상 종 료 → 종료 값, 이상 종 료 → 종료 신호) wait 함수 로 매개 변수 status 를 전송 하여 프로 세 스 의 종료 상 태 를 저장 할 수 있 습 니 다.매크로 함 수 를 빌려 프로 세 스 가 종 료 된 구체 적 인 원인 을 한층 더 판단 하 다.매크로 함 수 는 다음 과 같은 세 그룹 으로 나 눌 수 있 습 니 다. 1. WIFEXITED (status) 는 0 이 아 닌 프로 세 스 가 정상적으로 끝 났 습 니 다. WEXITSTATUS (status) 는 위의 매크로 와 같 습 니 다. 이 매크로 를 사용 하여 프로 세 스 종료 상태 (exit 의 인자) 를 가 져 옵 니 다. 2. WIFSIGNALLED (status) 는 0 이 아 닌 프로 세 스 이상 종료 WTERMSIG (status) 는 위의 매크로 와 같 습 니 다. 이 매크로 를 사용 하여 프로 세 스 를 종료 시 키 는 신호 번 호 를 가 져 옵 니 다. *3. WIFSTOPPED (status) 는 0 이 아 닌 프로 세 스 가 일시 정지 상태 에 있 습 니 다. WSTOPSIG (status) 는 위의 매크로 와 같 습 니 다. 이 매크로 를 사용 하여 프로 세 스 를 일시 정지 시 키 는 신호 번 호 를 가 져 옵 니 다.WIFCONTINUED (status) 는 진 → 프로 세 스 일시 정지 후 계속 실행 되 었 습 니 다.
사례 1
#include
#include
#include
int main()
{
    pid_t pid;
    int wpid;
    pid =  fork();
    if(pid == -1)
    {
            perror("fork:");
            exit(1);
    }
    if(pid == 0)
    {
            printf("i am child .pid = %ld,ppid = %ld
",getpid(),getppid()); sleep(10); printf("child did.
"); } else if(pid > 0) { sleep(1); wait(&wpid);// wait , , , , , , 。** , 。** if(wpid==-1) { perror("wait error:"); exit(1); } while(1) { printf("i am parent. pid = %d,myson= %ld
",getpid(),pid); sleep(1); } } return 0; }

waitpid 함수 작용 은 wait 와 같 지만 pid 프로 세 스 를 지정 하여 청소 할 수 있 으 며 막 히 지 않 을 수 있 습 니 다.pid_t waitpid(pid_t pid, int *status, in options); 성공: 삭 제 된 하위 프로 세 스 ID 되 돌리 기;실패: - 1 (하위 프로 세 스 없 음) 특수 매개 변수 와 반환 상황:
인자 pid:
0 지정 한 ID 를 회수 하 는 하위 프로 세 스 - 1 임의의 하위 프로 세 스 회수 (wait 에 해당) 0 회수 와 현재 waitpid 를 호출 하 는 그룹의 모든 하위 프로 세 스 < - 1 지정 한 프로 세 스 그룹 내의 임의의 하위 프로 세 스 회수 0: 인삼 3 은 WNOHANG 이 고 하위 프로 세 스 가 실행 중 이 며 0 을 되 돌려 줍 니 다.
메모: 한 번 wait 또는 waitpid 호출 은 키 프로 세 스 만 청소 할 수 있 습 니 다. 여러 키 프로 세 스 를 청소 하려 면 순환 을 사용 해 야 합 니 다.사례 2:
#include
#include
#include

int main(int argc,char *argv[])
{
    int n = 5,i;
    pid_t p,wpid=0;

    if(argc == 2)
    {
            n = atoi(argv[1]);
    }
    for(i=0;i0)
            {
                    wpid=waitpid(-1,NULL,WNOHANG);
                    /*waitpid         WNOHONG ,           0,
                                   pid.*/
                    if(wpid>0)//waipid    
                       n--;
            }
            printf("wait finish.
"); } else { sleep(i); printf("i am %dth child.pid = %d
",i+1,getpid()); } return 0; }

연습: 부모 프로 세 스 fork 3 키 프로 세 스, 3 키 프로 세 스 1 호출 ps 명령, 1 호출 사용자 정의 프로그램 1 (정상), 1 호출 사용자 정의 프로그램 2 (단락 오류 발생).부모 프로 세 스 는 waitpid 를 사용 하여 하위 프로 세 스 를 회수 합 니 다.
#include
#include
#include

int main()
{
    pid_t pid,wpid=0;
    int n=3,i=0;
    int status;

    for(i=0;i0)
            {
                    wpid = waitpid(-1,&status,WNOHANG);
                    if(wpid>0)
                    {
                            if(WIFEXITED(status))
                                    printf("child exit nomally:%d
",WEXITSTATUS(status)); else if(WIFSIGNALED(status)) printf("child exit unexpected:%d
",WTERMSIG(status)); n--; } } } else { sleep(i); if(i == 0) { printf("i am %dth child
",i+1); execl("ps","ps","-aux",NULL); } else if(i == 1) { printf("i am %dth child
",i+1); execl("myapp","myapp",NULL); } else if(i == 2) { printf("i am %dth child
",i+1); execl("myapp2","myapp2",NULL); } } return 0; }

좋은 웹페이지 즐겨찾기