APUE 학습 노트 - 10.18 system 함수 와 waitpid

원본 링크:http://www.cnblogs.com/Windeal/p/4284644.html
시스템 함수
시스템 함 수 는 한 프로 세 스에 서 명령 행 (셸 명령 한 줄) 을 실행 하 는 데 편리 합 니 다.
용법 은 다음 과 같다.
프로그램 에서 시스템 을 통 해 명령 행 sleep 5 를 호출 했 습 니 다.(여기 서 지식 은 예 를 들 어 'bash test. sh' 와 같은 스 크 립 트 를 실행 할 수 있 습 니 다.
이 작은 프로그램 이 실 행 될 때 ps - aux 를 통 해 세 개의 프로 세 스 가 새로 추 가 된 것 을 볼 수 있 습 니 다.
하 나 는 저희 프로그램 자체 a. out 입 니 다.
하 나 는 셸 프로 세 스: sh - c * *
하 나 는 우리 가 실행 하 는 명령 행 프로 세 스 입 니 다: sleep 프로 세 스
system 함수 의 실현:
'APUE' 에 서 는 시스템 의 1 중 실현 을 보 여 주 었 다.
#include 
#include 

int main()
{
    printf("Hello
"); system("sleep 5"); return 0; }

많은 사람들 이 이 실현 에 대해 많은 의문 을 가지 고 있다. 의문점 은 주로 다음 과 같은 몇 가지 측면 에 있다.
우선: 인 터 럽 트 신호 SIGINT 와 정지 신호 SIGQUIT 를 무시 하 는 이 유 는 무엇 입 니까?
다음: 하위 프로 세 스 종료 신 호 를 왜 잠 그 는 지 SIGCHLD
또한 하위 프로 세 스 종료 신호 SIGCHLD 를 잠 근 후 waitpid 가 올 바 르 게 되 돌아 올 수 있 는 이 유 는 무엇 입 니까?
1. 인 터 럽 트 신호 SIGINT 와 정지 신호 SIGQUIT 를 왜 무시 합 니까?
앞에서 소개 한 바 와 같이... / a. out 이 실 행 될 때 세 개의 프로 세 스 가 생 겼 습 니 다. a. out, (셸 프로 세 스) sh - c, system 이 호출 한 명령 행 에서 생 성 된 프로 세 스 (예 를 들 어 sleep 5, apue 에서 ed 프로 세 스) 입 니 다.
SIGINT 와 SIGQUIT 를 무시 하지 않 으 면 상기 상황 이 발생 할 수 있 습 니 다. 'APUE' 에서 자체 디자인 한 SIGINT 와 SIGQUIT 신호 실현 을 통 해 테스트 를 실시 한 결과 SIGINT 와 SIGQUIT 신 호 는 '/ a. out' 이 발생 하 는 세 프로 세 스 에 보 내 는 것 을 발 견 했 습 니 다. 즉, a. out, sh - c, ed 에 보 내 는 것 입 니 다. (그 중에서 sh - c 는 기본적으로 이 신 호 를 무시 합 니 다)이렇게 하면 신 호 를 포착 할 수 있 는 것 은 a. out, ed 입 니 다. 이렇게 하면 실제 실행 중 에 상기 상황 이 발생 할 수 있 습 니 다. 우리 가 Ctl + c 를 통 해 ed (이러한 대화 형 프로그램 은 항상 ctl + c 로 닫 힙 니 다) 를 닫 으 려 고 할 때 신호 도 a. out, 즉 a. out 과 ed 가 모두 닫 혔 습 니 다. 그러면 a. out 과 다른 작업 도 완성 할 수 없 을 것 입 니 다.
이상 의 이유 로 저 희 는 system 에 SIGINT 와 SIGQUIT 를 차단 할 것 을 요구 합 니 다.
2. 하위 프로 세 스 종료 신 호 를 왜 잠 그 나 SIGCHLD
먼저 SIGCHLD 를 잠 그 지 않 으 면 시스템 에서 실행 하 는 명령 행 에서 만 든 하위 프로 세 스 (예: ed) 가 끝 날 때. / a. out 에 도 SIGCHLD 신 호 를 보 냅 니 다. 어떤 문제 가 발생 할 까요?
시스템 을 호출 하기 전에... / a. out 에서 하위 프로 세 스 (하위 프로 세 스 A) 를 만 들 었 고 wait 함 수 를 통 해 끝 날 때 까지 기 다 렸 습 니 다. 그러나 우리 의 ed 프로 세 스 가 끝 날 때 a. out 에서 SIGCHLD 를 보 낸 것 처럼 wait 가 직접 되 돌 아 왔 습 니 다. 이 로 인해 a. out 은 하위 프로 세 스 A 가 끝 날 때 까지 기다 릴 수 없습니다.
3. 왜 하위 프로 세 스 종료 신호 SIGCHLD 를 잠 근 후에 waitpid 가 정확하게 돌아 올 수 있 습 니까?
이 부분 에서 나 는 아직 정확 한 증 거 를 찾 지 못 했 지만 묘사 한 것 도 모두 합 리 적 인 추론 이다.
wait 와 waitpid 는 SIGCHLD 를 캡 처 하여 하위 프로 세 스 의 종료 상 태 를 되 돌려 주 는 것 이 아니 라 고 생각 합 니 다. 이 유 는 다음 과 같 습 니 다.
a. Linux 시스템 의 SIGCHLD 에 대한 기본 처리 방식 은 ignore 입 니 다.
b. 일부 code 에서 SIGCHLD 를 캡 처 한 다음 SIGCHLD 의 신호 처리 함수 에서 wait 를 호출 하여 부모 프로 세 스 를 막 지 않도록 합 니 다.
c. waitpid 의 option 옵션 이 WNOHANG 일 때 waitpid 는 즉시 되 돌아 갈 수 있 습 니 다. 즉, waitpid 를 순환 적 으로 호출 하여 하위 프로 세 스 가 종료 되 었 는 지 여 부 를 판단 할 수 있 습 니 다.
위의 세 가 지 를 기반 으로 기본적으로 waitpid 를 종료 할 수 있 습 니 다. SIGCHLD 를 캡 처 하여 하위 프로 세 스 상 태 를 판단 하 는 것 이 아니 라 차단 을 통 해 커 널 의 상태 값 을 읽 을 수 있 습 니 다.
다음으로 전송:https://www.cnblogs.com/Windeal/p/4284644.html

좋은 웹페이지 즐겨찾기