반응형
(본 강의 노트는 한빛 아카데미의 <유닉스 시스템 프로그래밍> 책을 기반으로 하고 있습니다)
Ch06. 프로세스 생성과 실행
학습목표
- 프로세스를 생성하는 방법을 이해한다.
- 프로세스를 종료하는 방법을 이해한다.
- exec함수군으로 새로운 프로그램을 실행하는 방법을 이해한다.
- 프로세스를 동기화하는 방법을 이해한다.
목차
- 프로세스 생성
- 프로세스 종료함수
- exec 함수군 활용
- exec 함수군과 fork 함수
- 프로세스 동기화
01. 프로세스 생성
프로그램 실행 : system( )
- 새로운 프로그램을 실행하는 가장 간단한 방법이나 비효율적이므로 남용하지 말 것
- 실행할 프로그램명을 인자로 지정
프로세스 생성 : fork( )
- 새로운 프로세스를 생성 : 자식 프로세스(Cv hild Process)
- fork 함수를 호출한 프로세스 : 부모 프로세스(Parent Process)
- 자식 프로세스는 부모 프로세스의 메모리를 복사
- 부모 프로세스와 다른점은?
- 자식 프로세스는 유일한 PID, PPID를 가짐
- 부모 프로세스가 설정한 프로세스 잠금, 파일 잠금, 기타 메모리 잠금은 상속 안함
- 자식 프로세스의 tms 구조체 값은 0으로 설정
- 부모 프로세스와 자식 프로세스는 열린 파일을 공유하므로 읽거나 쓸 때 주의
- fork 함수를 이용한 새로운 프로세스 생성 과정
02. 프로세스 종료 함수
프로세스 종료 : exit( )
- status : 종료 상태값
- 프로세스를 종료하고 부모 프로세스에게 종료 상태값 전달
![image-20201014140021225](/Users/mac/Library/Application Support/typora-user-images/image-20201014140021225.png)
프로세스 종료시 수행할 작업 예약 : atexit( )
- func : 종료시 수행할 작업을 지정한 함수명
프로그램 종료 : _exit()
- 일반적으로 프로그램에서 직접 사용하지 않고 exit함수 내부적으로 호출
03. exec 함수군 활용
- exec 함수군
- exec로 시작하는 함수들로, 명령이나 실행 파일을 실행할 수 있다.
- exec 함수가 실행되면 프로세스의 메모리 이미지는 실행파일로 바뀐다
- exec 함수군의 6가지 형태
- path : 명령의 경로 지정
- file : 실행 파일명 지정
- arg#, argv : main함수에 전달할 환경변수 지정
- envp : main함수에 전달할 환경변수 지정
- 함수의 형태에 따라 NULL값 지정에 주의해야 함
#include <unistd.h>
int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ..., const char *argn,(char *)0, char *const envp[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ..., const char *argn, (char *)0);
int execvp(const char *file, char *const argv[]);
04. exec 함수군과 fork 함수
- fork로 생성한 자식 프로세스에서 exec 함수군을 호출
- 자식 프로세스의 메모리 이미지가 부모 프로세스 이미지에서 exec 함수로 호출한 새로운 명령으로 대체
- 자식 프로세스는 부모 프로세스와 다른 프로그램 실행 가능
- 부모 프로세스와 자식 프로세스가 각기 다른 작업을 수행해야 할 때 fork와 exec 함수를 함께 사용
05. 프로세스 동기화
프로세스 동기화
- 부모 프로세스와 자식 프로세스의 종료 절차
- 부모 프로세스와 자식 프로세스는 순서와 상관없이 실행하고 먼저 실행을 마친 프로세스가 종료됨
- 부모 프로세스와 자식 프로세스 사이에 종료절차가 제대로 진행되지 않을 경우 좀비 프로세스 발생
- Zombie Process
- 실행 종료, 자원 반납한 자식 프로세스의 종료 상태를 부모 프로세스가 가져가지 않으면 발생
- 프로세스 테이블에만 존재
- 일반적인 제거 방법 없음
- 이를 방지하기 위해 부모 프로세스와 자식 프로세스를 동기화해야 함
- Orphan Process
- 자식 프로세스보다 부모 프로세스가 먼저 종료할 경우 자식 프로세스들은 고아 프로세스가 됨
- 고아 프로세스는 1번 프로세스(init)의 자식 프로세스로 등록
프로세스 동기화 함수
- 프로세스 동기화 : wait
- stat_loc : 상태정보를 저장할 주소
- wait 함수는 자식 프로세스가 종료할 때까지 부모 프로세스를 기다리게 함
- 부모 프로세스가 wait 함수를 호출하기 전에 자식 프로세스가 종료하면 wait 함수는 즉시 리턴
- wait 함수의 리턴값은 자식 프로세스의 PID
- 리턴값이 -1이면 살아있는 자식 프로세스가 하나도 없다는 의미
- 특정 자식 프로세스와 동기화 : waitpid( )
- pid에 지정할 수 있는 값
- if pid < -1 : pid의 절댓값과 같은 그룹ID에 속한 자식 프로세스 중 임의의 프로세스의 상태값 요청
- if pid == - 1: wait 함수처럼 임의의 자식 프로세스의 상태값을 요청
- if pid == 0 : 함수를 호출한 프로세스와 같은 프로세스 그룹에 속한 임의의 프로세스의 상태
- if pid > 0 : 지정한 PID의 상태값 요청
- Options : waitpid 함수의 리턴 조건'
- pid에 지정할 수 있는 값
반응형
'Computer Science > 유닉스프로그래밍' 카테고리의 다른 글
[유닉스 시스템 프로그래밍] Ch08. 메모리 매핑 (0) | 2020.11.16 |
---|---|
[유닉스 시스템 프로그래밍] Ch07. 시그널 (0) | 2020.11.04 |
[유닉스 시스템 프로그래밍] Ch05. 프로세스 정보 (0) | 2020.10.19 |
[유닉스 시스템 프로그래밍] Ch04. 시스템 정보 (0) | 2020.10.19 |
[유닉스 이론과 실습] ch06. 파일 접근 권한 관리하기 (0) | 2020.10.19 |