CODE CAVE

[Linux / 리눅스] C언어 exec 시스템 호출 함수 본문

Server/Linux

[Linux / 리눅스] C언어 exec 시스템 호출 함수

코드케이브 2016. 6. 8. 20:45

int execl(char* path, char* arg0, char* arg1, ... , char* argn, NULL)

int execv(char* path, char* argv[ ])

int execlp(char* file, char* arg0, char* arg1, ... , char* argn, NULL)

int execvp(char* file, char* argv[ ])


뭔가 비슷비슷해서 차이점을 한번에 알기 조금 힘드시죠?


간단히 정리하면 

execvp() execv() 같으나 실행할 파일을 환경변수 PATH가 지정한 디렉터리에서 찾는 점만 다릅니다.


execlp() execl() 같으나 실행할 파일을 환경변수 PATH가 지정한 디렉터리에서 찾는 점만 다릅니다


즉, 

"echo $PATH" 라는 명령으로 PATH 환경변수 내용을 확인 할 수 있습니다.

execvp나 execlp는 이 PATH 목록에 있는 경로에서 파일을 찾는것 입니다~


주의사항으로는 

execv()execvp()의 파라매터 char* argv[]의 마지막은 꼭 NULL 포인터여야 합니다.


execl과 execlp는 파라미터의 마지막에 NULL을 받게되어있지만 execv()와 execvp()는 그렇지 않죠~

NULL은 배열의 끝을 알리기 위해 필요 하기 때문입니다~ 


개인적으로는 execlp()가 제일 편하더라구요~ 


아래는 execl와 execlp를 사용한 예제 입니다~

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

int main(int ac, char *argv[]){
        if(ac < 2){
                printf("Usage: myexec [a|b]");
                exit(0);
        }
        switch(*argv[1]){
                case 'a' :
                        if(fork() == 0){
                                execl("/home/ced00/sip/ch12/myprog1", "./myprog1", "14", NULL);
                                fprintf(stderr, "first fail\n");
                                exit(1);
                        }
                break;
                case 'b' :
                        if(fork() == 0){
                                execlp("myprog2", "./myprog2", "12", NULL);
                                fprintf(stderr, "second fail\n");
                                exit(2);
                        }
                break;
        }
        printf("end parent process.\n");
        exit(0);
}



이런 시스템 프로그래밍 같이 좀 운영체제와 가까운 프로그래밍일 수록 더 차근차근 보시는게 중요합니다.


그럼 모두들 힘내세요! 홧팅





도움이 되셨다면 아래 하트를 뿅..