extern char **environ;에 관한 질문입니다.

lovejin0309의 이미지

// 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 이란 변수가 어떤 역활을 해 주길래 환경 변수 내용이 전부 출력이 될 수 있는지 궁급합니다.

좋은 하루 되세요.

purewell의 이미지

$ 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 좋아요~

advanced의 이미지

environ 은 환경변수 리스트의 포인터 입니다.(POSIX 에 의해 정해진)

저 방법 말고도 전통적으로 유닉스 시스템에서는 main 함수의

세번째 인자로 환경 변수리스트를 받을 수 있다는군요(아래와 같이)

int main(int argc,char *argv[],char *envp[])

- advanced -

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.