링크 ux 운영 체제 프로 세 스 하위 프로 세 스 회수
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.