c - execlp() 함수

Development/C 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



'Development > C' 카테고리의 다른 글

c - return vs exit  (0) 2016.03.16
c - waitpid() 함수  (0) 2013.11.03
c - pid_t  (0) 2013.11.03
c - 메모리 맵(memory map)  (1) 2013.08.30
c - 구조체  (0) 2013.04.26
Posted by linuxism
,

c - pid_t

Development/C 2013. 11. 3. 11:14


pid_t가 뭔가요?

kcv의 아바타

안녕하세요
제가 학교시험 준비과정에서 신기한 변수? 구조체?를 봤는데
pid_t 이놈의 정체는 무엇인가요?

pid_T getpid(void);
이 함수를 보다가 우연히 알게 되었는데 웹검색에 정의같은건 찾기가 힘드네요

^^

익명 사용자의 아바타

bits/types.h:typedef int __pid_t;

bits/types.h:typedef int __pid_t;

익명 사용자의 아바타

프로세스 번호(pid)를 저장하는 타입(t)이라는 의미입니다.시스

프로세스 번호(pid)를 저장하는 타입(t)이라는 의미입니다.

시스템마다 프로세스번호가 int일 수도 있고 아닐 수도 있기
때문에 pid_t를 사용하는 것이 이식성면에서 더 낳은
코드가 될 것 같네요. 리눅스도 미래에는 long형을
프로세스 번호로 사용하게 될 지도 모르죠

feelpassion의 아바타

여담이지만,,,,pid_t 는 2~32768까지의 범위를 갖습니다. 0번

여담이지만,,,,pid_t 는 2~32768까지의 범위를 갖습니다. 0번 프로세스는 부팅 후 바로 사라지고 1번은 모든 프로세스의 부모 프로세스인 init프로세스입니다. 그 다음은 여러가지 데몬 프로그램들이 번호를 차지하겠죠... 글구나서 우리가 사용하는 프로그램들의 프로세스 번호가 매겨지는 것입니다. 32768개 이상은 프로세스 생성이 불가능 한 걸루 알고 있습니다.

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

익명 사용자의 아바타

음.. 현재로선 그런가요??

음.. 현재로선 그런가요??

PID_MAX_DEFAULT 가 0x8000 (== 32768)로 정해져

PID_MAX_DEFAULT 가 0x8000 (== 32768)로 정해져 있기 때문에
그냥 기본옵션으로 커널을 컴파일했을 경우, 프로세스가 0~32767 범위의
pid를 가질 수 있을 뿐입니다. pid_t 형의 변수는 경우에 따라서 32767을 초과하는
값도 가질 수 있습니다. -1도 가질 수 있지요. :-) (fork()는 -1을 리턴하는 경우도
있으니까요.)

pid_t 와 같이 typedef로 정해져 있는 타입을 opaque type이라고 부르더군요.
좀더 포터블한 프로그램을 만들기 위해 씁니다. atomic_t 라든지, gid_t 도 같은
맥락에서 사용되죠.

----
Let's shut up and code.



출처 - https://kldp.org/node/42421



'Development > C' 카테고리의 다른 글

c - waitpid() 함수  (0) 2013.11.03
c - execlp() 함수  (0) 2013.11.03
c - 메모리 맵(memory map)  (1) 2013.08.30
c - 구조체  (0) 2013.04.26
c - 포인터(pointer) 이해  (0) 2013.04.25
Posted by linuxism
,


일반적으로 Java Script 의 스크롤된 위치를 알아오기 위해서 document.body.scrollTop 을 사용한다.

하지만 상단에 DOCTYPE 이 선언된 경우 이 값이 항상 0으로 출력 된다.

이때는 document.documentElement.scrollTop 로 사용하도록 한다.


출처 - http://wiz.pe.kr/184


'Development > JavaScript' 카테고리의 다른 글

shell script - 쉘 스크립트란  (1) 2013.11.07
javascript - 쿠키로 id 저장  (0) 2013.11.06
Backbone.js  (0) 2013.10.13
javascript - 라우팅  (0) 2013.10.13
javascript - RequireJS  (0) 2013.10.02
Posted by linuxism
,