본문 바로가기
programming/Unix

[Unix Programming] 7. 프로세스 생성과 실행

by je0nsye0n 2024. 12. 11.

프로세스의 생성

  • fork 시스템 호출

pid_t fork(void);

return : 성공시 pid, 0 / -1 (실패원인 : 시스템 전체의 프로세스 수 제한, 한 프로세스 생성할 수 있는 프로세스 수 제한)

→ 수행되던 프로세스(parent)의 복사본 process(child) 생성

→ fork() 바로 다음 문장부터 동시에 실행

  • 두 프로세스의 차이점
    • pid와 ppid가 다르다
    • fork()의 반환값이 다르다
      • parent procee : child process의 pid
      • child process : 0
  • fork : 파일과 자료
    • 모든 변수 값이 그대로 복제 된다
    • fork()후에 변경된 값은 복제되지 않는다
    • file descriptor도 복제된다.
      • parent process가 open한 file은 child process에게도 open;
    • parent와 child가 파일을 공통으로 사용 가능

exit 시스템 호출

  • 사용법 :

void exit(int status);

exit : process 정지 → open된 파일 닫기 → clean-up-action

  • clean-up-action 지정

int atexit(void (*func) (void)); // 지정된 순서의 역순으로 실행

exec 이용하여 새 프로그램 수행

프로세스 동기화

  • wait 시스템 호출 :
    • 하나 이상의 child process 수행 시 아무나 하나가 종료되면 return
    • status : child의 종료 상태가 전달

pid_t wait(int *status);

return : 종료된 child의 id / -1(살아있는 child process가 없는 경우)

  • WIFEXITED(status) : status의 하위 8bit가 0인지 검사 → 정상 종료인지 검사
  • WEXITSTATUS(ststus) : status의 상위 비트에 저장된 값을 return;

왜?) child가 parent에게 전달하는 값이 status의 상위 8bit에 저장됨