exec 동작 방식

2019. 11. 7. 21:06임베디드/리눅스시스템프로그래밍

fork 시스템 콜은 새로운 프로세스 공간을 별도로 만들고, 호출한 프로세스는 부모 프로세스 공간을 모두 복사한다. 반면에 exec 시스템 콜은 현재 프로세스 공간의 Text, Data, Bss 영역을 새로운 프로세스의 이미지로 덮어씌운다. 따라서 exec를 실행하면 그 뒤에 있던 Text 코드는 다른 것으로 덮어씌어지게 된다

 

exec 계열에서 파생된 라이브러리 함수는 다양하다

 

execl에서 PATH는 환경변수의 경로를 의미한다. arg가 경로를 찾을 수 없을 때 path를 참조한다

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv) {
    printf("execute ls\n");    
    execl("/bin/ls", "ls", "-al", NULL); 
    printf("execute ls fail\n");
    return 0;
}

 

v가 들어간 함수는 arg에 대한 문자열 배열을 미리 정의해서 넣어주는 것이다

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char *arg[] = { "ls", "-al", NULL };
    printf("execute 'execv'\n");
    execv("/bin/ls", arg);
    perror("execute 'execv' fail\n");
            
    return 0;
}

 

execlp는 실행파일에 대한 경로를 기본으로 설정되어 있는 PATH에서 찾게 된다. PATH에 잡혀있는 경로를 탐색하면서 명령어를 찾게 된다. 따라서 execlp 함수를 사용할 때는 모든 path를 적을 필요가 없다는 장점이 있다

 

 printenv | grep "PATH" 

'임베디드 > 리눅스시스템프로그래밍' 카테고리의 다른 글

copy on write의 내부 동작  (0) 2019.11.08
fork와 exec로 나만의 쉘 만들기  (0) 2019.11.08
프로세스 최대 생성 수  (0) 2019.11.07
pthread_join과 pthread_detach의 차이  (0) 2019.11.03
pthread  (0) 2019.11.03