#include <unistd.h>
int fatal(char *p){
perror(p);
exit(1);
}
//--------------------------------------------------------
main(){
int p_id;
switch(p_id = fork()){ //-- #1
case -1: //-- #2
fatal("fork 실패");
break;
case 0:
execl("/bin/ps","ps", "-ed", (char *)0); //-- #3
fatal ("execl 실패"); //-- #4
break;
default:
wait((int *)0); //-- #5
printf("ps 수행 완료\n"); //-- #6
break;
}
}
//-------------------------------------------------------
주요라인 |
프로세스 설명 |
#1 |
fork() 함수로 subprocess 생성 |
#2 |
subprocess 생성 실패시 fatal() 호출 |
#3 |
subprocess 생성되면 execl()함수로 ps 명령어 실행 |
fork()로 생성된 프로세스는 execl()의 명령어로 대체됨 |
|
#4 |
execl() 로 실행될 경우 subprocess의 내용이 execl()내용으로 변경 |
따라서 fatal("execl 실패") 는 실행되지 않음 |
|
#5 |
최초 mainprocess는 생성된 subprocess 가 종료될때 까지 대기 |
#6 |
수행완료 메시지 출력 |
- Fork()로 생성된 subprocess는 메모리 상에 기존 process를 그대로 복사하여 생성되고 PID만 별도로 할당
- execl()이 실행되면 해당 내용으로 대체되고 복사된 process의 내용은 메모리에서 삭제됨
UNIX 명령어 대체 예시 ( shell script, BASH 사용기준)
- {ps –ed } : 서브프로세스로 명령어 실행
- Script 방식 : if문 사용, -eq (=), 성공/ 실패 분기
- 명령어 방식 : && (앞 명령어 성공), || (앞 명령어 실패시)