Development/C

c - execlp() 함수

linuxism 2013. 11. 3. 12:26


설명

PATH 에 등록된 디렉토리를 참고하여 다른 프로그램을 실행하고 종료합니다.

]$ set
                :

PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:
/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

                :

이렇게 다른 프로그램을 실행하고 자신은 종료해 주는 함수에는 아래와 같이 여러 가지가 있습니다.

함수 이름
int execl( const char *path, const char *arg, ...);
int execlp( const char *file, const char *arg, ...);
int execle( const char *path, const char *arg ,..., char * const envp[]);
int execv( const char *path, char *const argv[]);
int execvp( const char *file, char *const argv[]);
int execve (const char *filename, char *const argv [], char *const envp[]);

각 함수는 아래와 같은 차이가 있습니다.

함수 이름프로그램 지정명령라인 인수함수 설명
execl디렉토리와 파일 이름이 합친 전체 이름인수 리스트환경 설정 불가
execlp파일 이름인수 리스트환경 설정 불가
execle디렉토리와 파일 이름이 합친 전체 이름인수 리스트환경 설정 가능
execv디렉토리와 파일 이름이 합친 전체 이름인수 배열환경 설정 불가
execvp파일 이름인수 배열환경 설정 불가
excve전제 경로 명인수 배열환경 설정 가능

프로그램 지정에서 디렉토리와 파일 이름이 합친 전체 이름으로 지정하는 것과 파일 이름만 지정하는 것의 차이는, execl()처럼 전체 이름을 요구하는 함수는 지정한 디렉토리의 프로그램을 실행하지만 execlp()함수처럼 프로그램 이름만 요구하는 함수는 현재 PATH 환경에 등록된 디렉토리를 있는 프로그램을 실행합니다.

즉,

execl()은 아래와 같이 프로그램이 들어 있는 디렉토리명까지 입력해 주어야 합니다.

execl( "/bin/ls", "/bin/ls", NULL);

아래와 같이 프로그래명만 입력하면 실행이 안 됩니다.

execl( "ls", "ls", NULL);

그러나 execlp()는 PATH에 등록된 모든 디렉토리에 있는 프로그램을 실행하므로 프로그램 이름만 입력해도 실행이 됩니다.

execlp( "ls", "ls", NULL);
인수 중복 이유그런데 설명을 보면 프로그램 이름을 중복해서 입력했는데, 이는 프로그램을 실행하면 첫번째 인수가 실행한 프로그램의 전체 이름이기 때문입니다.

다시 말씀 드려 man()함수의 인수준 *argv[]의 첫번째 문자열 argv[0]은 실행한 프로그램의 이름입니다.

int main( int argc, char *argv[])
{
   printf( "%s\n", argv[0]);
   return 0;
}

예로

   ]$ ./a.out

으로 실행했다면 argv[0]은 "./a.out"이 되며,

   ]$ /home/jwjw/prjs/test_fun/a.out

으로 실행했다면 argv[0]은 "/home/jwjw/prjs/test_fun/a.out"이 됩니다. 또한 어떤 프로그램은 이 첫번재 인수를 이용할 수 있으므로 파일의 전체 이름을 입력해 주는 것이 좋습니다.

헤더unistd.h
형태int execlp( const char *file, const char *arg, ...);
인수char *file실행할 파일 이름
 const char *arg인수 목록
반환int실패일 때만 -1
예제
#include <stdio.h>
#include <unistd.h>

int main()
{
   execlp( "ls", "ls", "-al", "/tmp", NULL);

   printf( "이 메시지가 보이면 지정된 프로그램이 \
없거나 어떤 문제로 실행되지 못한 것입니다.\n");
}
]$ ./a.out
합계 32
drwxrwxrwt  6 root root 4096  9월 30 05:47 .
drwxr-xr-x 24 root root 4096  9월 29 21:20 ..
srwxrwxr-x  1 jwjw jwjw    0  9월 13 14:39 process_b
srwxrwxr-x  1 jwjw jwjw    0  9월 14 08:34 uds_a
srwxrwxr-x  1 jwjw jwjw    0  9월 14 08:36 uds_b
]$



출처 - http://forum.falinux.com/zbxe/index.php?document_srl=408557&mid=C_LIB