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() 함수로 프로그램 실행하기
<예제 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() 함수의 특징
- fork() 함수를 호출
- 새로운 프로세스(자식 프로세스)를 생성
- fork() 함수로 생성한 자식 프로세스의 메모리 공간은 부모 프로세스의 메모리 공간을 그대로 복사해서 만듬
- 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() 함수로 프로세스 생성하기
<예제 7-2 관전 Point>
- 리턴 값이 -1이면 오류 발생, 0이면 자식 프로세스가 실행 중, 양수 값(자식 프로세스의 PID)이면 부모 프로세스가 실행 중
- 자식 프로세스에서 출력한 부모 프로세스의 PID와 부모 프로세스에서 출력한 자신의 PID가 동일함을 알 수 있음
- 부모 프로세스가 먼저 실행되었지만 다시 실행했을 때는 자식 프로세스가 먼저 실행될 수도 있음
- => 부모, 자식 프로세스의 실행 순서는 '스케줄링'에 따라 달라진다.