fork() / execl()

프로그래밍/C/C++/etc 2019. 11. 7. 23:42 posted by 야매코더

 

#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 (=), 성공/ 실패 분기

-  명령어 방식 : && (앞 명령어 성공), || (앞 명령어 실패시)