[리눅스] system 함수 - sleep, wait

프로세스 동기화 - wait

정상적인 프로세스 종료 과정

자식 프로세스가 종료를 위해 부모 프로세스에 종료 상태 정보를 보내고,

부모 프로세스는 이 정보를 받으면 프로세스 테이블에서 자식 프로세스를 삭제.

비정상적인 상황 발생

자식 프로세스가 모든 자원을 반납했어도 부모 프로세스가 종료 상태 정보를 얻어가지 않거나 자식 프로세스보다 먼저 종료하는 경우 발생

=> 좀비 프로세스 발생 ( 테이블에만 존재, 일반적인 방법으로 제거 불가능, 자식 프로세스는 고아 프로세스가 되고 init(PID 1) 프로세스의 자식 프로세스로 등록. )

=> 부모 프로세스와 자식 프로세스를 동기화 , 부모 프로세스가 wait 관련 함수를 호출해야 사라진다.

프로세스 동기화 : wait(3)

부모 프로세스와 자식 프로세스를 동기화하 =  부모 프로세스는 자식 프로세스가 종료할 때까지 기다려야 한다. 자식 프로세스의 실행이 완전히 끝나기를 기다렸다가 종료 상태를 확인하는 함수 = wait ,  waitpid

wait 함수의 역할

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int * stat_loc);

stat_loc : 상태 정보를 저장할 주소 (= output 파라미터)


만약 부모 프로세스가 wait 함수를 호출하기 전에 자식 프로세스가 종료하면,

wait 함수는 즉시 리턴한다.

wait 함수 예시
모든 자식 프로세스가 종료될때까지 반복

프로세스 동기화 : waitpid(3)
#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid, int * stat_loc, int options);

stat_loc : 상태 정보를 저장할 주소
pid : 종료를 기다리는 PID
options : waitpid 함수의 리턴 조건

wait 함수는 자식 프로세스가 여러 개일 경우,

아무 자식 프로세스가 종료하면 리턴하지만,

waitpid 함수는 특정 PID의 자식 프로세스가 종료하기를 기다린다.

> 첫번째 인자인 pid 에 지정할 수 있는 값과 그 의미 

  • -1보다 작은 경우 : pid 의 절댓값과 같은 프로세스 그룹 ID에 속한 자식 프로세스 중 임의의 프로세스의 상태값을 요청.
  • -1 인 경우 : wait 함수 처럼 임의의 자식 프로세스의 상태값을 요청
  • 0인 경우 : 함수를 호출한 프로세스와 같은 프로세스 그룹에 속한 임의의 프로세스의 상태값을 요청
  • 0보다 큰 경우 : 지정한 pid에 해당하는 프로세스의 상태값 요청 ( 자식 프로세스 범위 좁힌 것)

> 세번째 인자인 options 에 지정할 수 있는 값과 그 의미 

  • WHOHANG : pid로 지정한 자식 프로세스의 상태값을 즉시 리턴받을 수 없어도 이를 호출한 프로세스의 실행을 블록하지 않고 다른 작업을 수행하게 한다. (종료된 자식 프로세스가 없으면, 바로 0 리턴)
    • returns 0 to report that there are possible unwaited-for children but their status is not available
  • WUNTRACED : 실행을 중단한 자식 프로세스의 상태값을 리턴. 실행이 중단되었으므로 더 이상 상태값을 리턴하지 않는다.

위 매크로 함수의 매개변수에는 int * 값이 들어감 (수정해야됨)

 

 

참고 사이트

 

wait, waitpid의 사용

Parent process는 wait, waitpid를 사용하여 자신이 생성한 child process들이 종료되기 전까지 기다려 줄 수 있다. 또, 자식들이 어떻게 종료되었는지와 child process가 종료 할 때의 반환한 값도 알 수 있다. w

tempdev.tistory.com