본문 바로가기
카테고리 없음

[System Programming] 7장 프로세스 생성 fork()

by winter_sunshine 2023. 10. 30.

1.  프로세스 생성 & 종료

  • 프로세스 생성 함수
    • 프로그램 안에서 다른 프로그램을 실행해 새로운 프로세스를 생성할 때 system(), fork(), vfork() 함수를 사용

  • 프로세스 종료 함수
    • 리눅스는 프로세스가 종료되면 해당 프로세스가 어떻게 종료되었는지를 나타내는 종료 상태를 저장
    • 자식 프로세스부모 프로세스에 자신이 어떻게 종료되었는지를 알리는 종료 상탯값을 리턴할 수 있음
    • 일반적으로 종료 상탯값이 0이면 정상적으로 종료했음을 의미하고, 0이 아니면 오류가 발생했음을 의미
    • 프로그램을 종료할 때는 exit(),  atexit(),  on_exit(),  _exit() 함수를 사용

 

  • exec 함수군
    • exec 함수군인자로 받은 다른 프로그램을 자신을 호출한 프로세스의 메모리에 덮어씀
    • 따라서 프로세스가 수행 중이던 기존 프로그램은 중지되어 없어지고 새로 덮어쓴 프로그램이 실행
    • exec 함수군은  fork() 함수와 연결하여  fork() 함수로 생성한 자식 프로세스가 새로운 프로그램을 실행하도록 할 때도 사용

 

2.  프로세스 동기화

  • 프로세스 동기화의 필요성
    • fork() 함수로 자식 프로세스를 생성하면 부모 프로세스와 자식 프로세스는 순서에 관계없이 실행
    • 먼저 실행을 마친 프로세스는 종료
    • 좀비 프로세스 같은 불안정 상태의 프로세스가 발생
    • 프로세스 동기화 함수인  wait(),  waitpid(),  waitid() 함수를 사용하여 부모 프로세스와 자식 프로세스동기화 해야함.

 

 

3.  프로그램 실행 :  system(3)

  • system()  함수의 특징
    • 기존 명령이나 실행 파일명인자로 받아 쉘(shell)에 전달
    • 쉘은 내부적으로 새 프로세스를 생성인자로 받은 명령을 실행
    • 해당 명령의 실행이 끝날 때까지 기다렸다가 종료 상태를 리턴

 

 

◼   [예제 7-1]   system() 함수로 프로그램 실행하기

프로그램 실행:  system()
실행 결과

<예제 7-1 관전 Point>

  • 파이프로 연결된 "ps -ef | grep sshd > sshd.txt" 명령을 실행하도록 system() 함수를 호출
  • 인자로 전달된 명령은 현재 실행 중인 프로세스에서 ‘sshd’를 포함한 내용을 찾아 sshd.txt 파일에 저장
  • system() 함수로 실행한 명령인 "sh -c ps -ef | grep sshd > sshd.txt" 가 실행되고 있는것을 확인
  • system() 함수로 명령을 실행하면 "bash" 쉘로 실행되고 -C 옵션이 지정
  • "bash" 쉘에서  –C 옵션문자열에서 명령을 읽어오라는 뜻

 

4.  프로세스 생성

  • fork() 함수의 개요
    • 리눅스에서 프로세스를 생성해 프로그램을 실행하는 대표적인 방법fork() 함수를 사용하는 것
    • 자식 프로세스
      • fork() 함수가 생성부모 프로세스와 똑같은 새로운 프로세스
    • fork() 함수가 리턴하면 부모 프로세스와 자식 프로세스가 동시에 동작하는데, 어느 프로세스가 먼저 실행될지는 알 수 없음
    • 처리 순서는 시스템의 스케줄링에 따라 달라짐

  • fork() 함수의 특징
    1. fork() 함수를 호출
    2. 새로운 프로세스(자식 프로세스)를 생성
    3. fork() 함수로 생성한 자식 프로세스의 메모리 공간부모 프로세스의 메모리 공간을 그대로 복사해서 만듬
    4. fork() 함수는 부모 프로세스에는 자식 프로세스의 PID를 리턴하고 자식 프로세스에는 0을 리턴
  • 자식 프로세스가 상속받는 대표적인 속성
    • 실제 사용자 ID(RUID), 유효 사용자 ID(EUID), 실제 그룹 ID(RGID), 유효 그룹 ID(EGID)
    • 환경 변수
    • 열린 파일 기술자
    • 시그널 처리 설정
    • setuid, setgid 설정
    • 현재 작업 디렉터리
    • umask 설정값
    • 사용 가능한 자원 제한
  • ★ 자식 프로세스와 부모 프로세스와 다른 점 ★
    • 자식 프로세스새로 할당된 프로세스 ID를 가짐
    • 자식 프로세스를 호출한 부모 프로세스자식 프로세스의 PPID로 설정
    • 자식 프로세스는 부모 프로세스가 열었던 파일 기술자에 대한 복사본을 갖고 있음
      • => 부모 프로세스와 자식 프로세스가 같은 파일의 오프셋을 공유하고 있는 상태가 되므로 읽거나 쓸 때 주의해야 함
    • 자식 프로세스는 부모 프로세스가 설정한 프로세스 잠금, 파일 잠금, 기타 메모리 잠금 등은 상속하지 않음
    • 처리되지 않은 시그널자식 프로세스로 상속되지 않음
    • 프로세스 실행 시간을 측정하는 기준 값새로 설정

 

5.  프로세스 생성 :   fork(2)

  • fork() 함수의 특징
    • 인자를 받지 않음
    • 수행에 성공하면 부모 프로세스에는 자식 프로세스의 PID를, 자식 프로세스에는 0리턴
      • 실패하면  –1을 리턴 

 

◼  [예제 7-2]   fork() 함수로 프로세스 생성하기

프로세스 생성:  fork()
실행 결과

<예제 7-2 관전 Point>

  • 리턴 값이 -1이면 오류 발생,  0이면 자식 프로세스가 실행 중,  양수 값(자식 프로세스의 PID)이면 부모 프로세스가 실행 중
  • 자식 프로세스에서 출력한 부모 프로세스의 PID부모 프로세스에서 출력한 자신의 PID동일함을 알 수 있음
  • 부모 프로세스가 먼저 실행되었지만 다시 실행했을 때는 자식 프로세스가 먼저 실행될 수도 있음
    • => 부모, 자식 프로세스의 실행 순서는 '스케줄링'에 따라 달라진다.