🚩 Process의 생성
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
- 수행되던 process의 복사본 process 생성
- fork() 바로 다음 문장부터 동시에 실행
✔ 원본과 복사본 process의 차이점
- pid와 ppid가 다르다.
- fork()의 리턴값이 다르다.
- parent process의 return 값은 child process의 process id
- child process의 return 값은 0이다.
3. fork 실패 시 -1 return (실패 원인 - 시스템 전체 process의 수 제한, 한 process가 생성할 수 있는 process의 수 제한)

< 출력 결과 >
one
two
two
🚩 fork : 파일과 자료
- child process는 parent process의 복제
- 모든 변수 값이 그대로 복제된다.
- fork()후에 변경된 값은 복제되지 않는다.
- file descriptor도 복제된다 - parent process가 open한 file은 child process에게도 open
- parent와 child가 file을 공통으로 사용가능하다.
🚩 exit 시스템 호출
✔ 사용법
#include <stdlib.h>
void exit(int status);
- exit : process 정지 → open된 file 닫기 → clean-up-action
- status 의 값은 프로세스 종료 후, $ echo 또는 $ ? 명령에 의해 알아낼 수 있다.
✔ clean-up-action 지정
#include <stdlib.h>
int atexit(void (*func) (void));
: 지정된 순서의 역순으로 실행
🚩 exec을 이용하여 새 프로그램을 수행
✔ 사용법
#include <unistd.h>
int execl (const char * path, const char * arg0, ..., const char * argn, (char*)0 );
int execlp (const char * file, const char * arg0, ..., const char * argn, (char*)0 );
int execv (const char * path, char *const argv[]);
int execvp (const char* file, char * const argv[]);
✔ 공통점
- 호출 프로세스의 주기억장치 공간에 새로운 프로그램을 적재
→ 호출 프로세스는 no longer exists
→ 새 프로세스는 처음부터 실행
→ 새 프로세스는 호출 프로세스의 id로 실행
- 실패 시 -1 return; 성공 시 return 이 없다
- fork와의 차이점 : 기존 프로세스와 병렬 수행이 아니다.

🚩 exec 와 fork 를 함께 사용
< 코드 >

< 실행 결과 >


이를 통해 fork는 이전 프로세스가 실행하던 곳부터 이어서 실행하고, exec는 처음부터 실행함을 확인할 수 있다.
🚩 프로세스의 동기화
✔ wait 시스템 호출
#include <sys/wait.h>
#include <sys/types.h>
pid_t wait(int *status);
- 하나 이상의 child process 수행 시 아무나 하나가 종료되면 return 된다.
- return 값: 종료된 child의 id 또는 -1 (살아있는 child process가 없는 경우 실패)
- status : child의 종료 상태가 전달
✔ WIFEXITED(status) : status의 하위 8bit가 0인지 검사, 정상 종료인지 검사
✔ WEXITSTATUS(status) : status의 상위 비트에 저장된 값을 return
→ child가 parent에게 전달하는 값이 status의 상위 8bit에 저장된다.
✔ waitpid 시스템 호출
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
- pid : 기다리고 싶은 child의 id
- status : child의 종료 상태
- options : WNOHANG( 멈추거나 상태가 보고되지 않은 자식들을 위해 리턴 ) ; child가 종료되지 않았으면 0을 return
🚩 Zombie와 너무 이른 퇴장
- 부모 프로세스가 wait를 수행하지 않고 있는 상태에서 자식이 퇴장할 때, child는 zombie가 된다.
- 하나 이상의 자식 프로세스가 수행되고 있는 상태에서 부모가 퇴장할 때, child는 init ( pid=1 )의 child로 남는다.

'UNIX 프로그래밍' 카테고리의 다른 글
[2주차 실습] UNIX 실습 문제 (1) | 2023.10.22 |
---|---|
[1주차 실습] UNIX 실습 문제 (0) | 2023.10.15 |
[4주차, 5주차 개념] UNIX 시스템 정보/ 프로세스 정보 (0) | 2023.10.13 |
[3주차 개념] UNIX 파일과 디렉토리 (0) | 2023.09.27 |
[2주차 개념] UNIX 파일 입출력 (0) | 2023.09.27 |
댓글