extern char **environ;에 관한 질문입니다.
// Page : # 195 // Project Name : showenv.c #include <stdio.h> #include <stdlib.h> extern char **environ; int main(int argc, char *argv[]) { char **env = environ; while(*env) { printf("%s\n",*env); env++; } exit(0); }
결과
=====================================================
REMOTEHOST=lovejin
HOSTNAME=lovejin
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
USER=lovejin
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:
MAIL=/var/spool/mail/lovejin
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/root:/home/lovejin/bin
INPUTRC=/etc/inputrc
PWD=/home/lovejin/si/study1/ch4
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/home/lovejin
LOGNAME=lovejin
LESSOPEN=|/usr/bin/lesspipe.sh %s
DISPLAY=lovejin:0.0
G_BROKEN_FILENAMES=1
_=./showenv
OLDPWD=/home/lovejin/si/study1
=====================================================
Beginning Linux Programming (Richard stones & Neil matthew) 책의
페이지 195 에 나와 있는 showenv.c 예제와 실행 결과 입니다.
일단.. 이 질문 하면 욕하실 분이 많을 것 같은데요.
1. extern char **environ; 에서 "**" 가 무슨 뜻인지 잘 모르겠습니다.
2. environ 이란 변수가 어떤 역활을 해 주길래 환경 변수 내용이 전부 출력이 될 수 있는지 궁급합니다.
좋은 하루 되세요.
[code:1]$ man environ[/code:1]
$ man environ
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
포인터 변수에 대한 주소값을 가지는 변수입니다.포인터에대한 포인터
포인터 변수에 대한 주소값을 가지는 변수입니다.
포인터에대한 포인터입니다.
environ은 어떤 주소값을 가리키는 변수의 주소값을 가지고 있습니다.
char c; 라고 하면 c는 char 값을 가는 변수가 되는 거고
char *p; 라고 하면 char 타입의 변수의 주소값을 가지는 변수가 되고요
char **pp; 라고 하면 char 타입의 변수의 주소값을 가지는 변수의 주소값을
가지는 변수가 되는 겁니다.
우리가 변수를 선언할때 변수 자체는 어떤 주소 공간의 메모리 영역을 이름
붙이는 동시에 그 메모리 영역을 사용할때 그 변수의 타입으로 해석을 하는
겁니다. 물론 타입에 따라서 메모리 영역의 사이즈가 정해지는 거죠.
그럼 포인터형 변수는 그 메모리 영역 자체가 어떤 변수의 메모리 주소값이
되는 겁니다. 따라서 포인터형 변수의 포인터는 다시 메모리 주소값을 가리키는
변수의 주소값을 가지게 되겠죠(가진다는 말은 그 값을 그렇게 해석하겠다는
것을 의미 합니다.)
그럼 environ 자체는 포인터형 변수의 포인터니깐 environ+1은 그다음 포인터
변수에
대한 포인터가 되고 environ+2는 그 다음다음 포인터 변수에 대한 포인터
가 되는거죠.
그럼 *(environ+0) 는 처음 포인터의 변수의 값을 참조하고 *(environ+1)은
그 다음 포인터 변수의 값을 참조 하게 됩니다.
쉽게 얘기해서 포인터 배열에 대한 포인터라고 생각하면 됩니다. 포인터 배열은
포인터들의 배열이고 이 배열을 포인터 하는 것입니다.
*(environ+0) 과 environ[0]은 같은 표현이니 environ[0]가 포인터가
된다는 거고 environ[1] 역시 포인터가 된다는 거죠. environ[0]... [n]은
각각 환경변수에 대한 포인터라는 얘기입니다.
그림을 안그리고 푠현할려니 장황해 지네요..
screen + vim + ctags 좋아요~
environ 은 환경변수 리스트의 포인터 입니다.(POSIX 에 의해
environ 은 환경변수 리스트의 포인터 입니다.(POSIX 에 의해 정해진)
저 방법 말고도 전통적으로 유닉스 시스템에서는 main 함수의
세번째 인자로 환경 변수리스트를 받을 수 있다는군요(아래와 같이)
- advanced -
댓글 달기