본문 바로가기
UNIX 프로그래밍

[6주차 개념] UNIX 프로세스 생성과 실행

by 서영선 2023. 10. 13.

 

🚩 Process의 생성

 

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);

 

  • 수행되던 process의 복사본 process 생성
  • fork() 바로 다음 문장부터 동시에 실행

 

 

 

✔ 원본과 복사본 process의 차이점 

  1. pid와 ppid가 다르다.
  2. 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로 남는다.

 

 

 

 

 

 

Lect6 (1).pdf
0.78MB

 

 

댓글