프로세스 동기화 - wait
정상적인 프로세스 종료 과정
자식 프로세스가 종료를 위해 부모 프로세스에 종료 상태 정보를 보내고,
부모 프로세스는 이 정보를 받으면 프로세스 테이블에서 자식 프로세스를 삭제.
비정상적인 상황 발생
자식 프로세스가 모든 자원을 반납했어도 부모 프로세스가 종료 상태 정보를 얻어가지 않거나 자식 프로세스보다 먼저 종료하는 경우 발생
=> 좀비 프로세스 발생 ( 테이블에만 존재, 일반적인 방법으로 제거 불가능, 자식 프로세스는 고아 프로세스가 되고 init(PID 1) 프로세스의 자식 프로세스로 등록. )
=> 부모 프로세스와 자식 프로세스를 동기화 , 부모 프로세스가 wait 관련 함수를 호출해야 사라진다.
프로세스 동기화 : wait(3)
부모 프로세스와 자식 프로세스를 동기화하 = 부모 프로세스는 자식 프로세스가 종료할 때까지 기다려야 한다. 자식 프로세스의 실행이 완전히 끝나기를 기다렸다가 종료 상태를 확인하는 함수 = wait , waitpid
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int * stat_loc);
stat_loc : 상태 정보를 저장할 주소 (= output 파라미터)
만약 부모 프로세스가 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 : 실행을 중단한 자식 프로세스의 상태값을 리턴. 실행이 중단되었으므로 더 이상 상태값을 리턴하지 않는다.
참고 사이트
wait, waitpid의 사용
Parent process는 wait, waitpid를 사용하여 자신이 생성한 child process들이 종료되기 전까지 기다려 줄 수 있다. 또, 자식들이 어떻게 종료되었는지와 child process가 종료 할 때의 반환한 값도 알 수 있다. w
tempdev.tistory.com
'2023 2학기 > 리눅스' 카테고리의 다른 글
[시스템프로그래밍] Pipe (0) | 2023.11.14 |
---|---|
[리눅스] 예제 파일 정리 및 개념 간단 정리 (fork,sleep,wait,exec,exit,Unix I/O) (0) | 2023.10.12 |
[리눅스] Chapter1,2: Technology's Impact on Programs(2)/Programs, Process and Threads (0) | 2023.09.16 |
[리눅스] Chapter1: Technology's Impact on Programs (1) (0) | 2023.09.16 |
[리눅스] 기초 명령어2-2 <redirection & pipe> <grep> <gcc> (0) | 2023.09.04 |