직접 환경변수 읽기

Necromancer의 이미지

C 라이브러리에서 환경변수 읽는 함수가 있기는 하지만, 직접 읽는 방법도 있습니다.

#include <stdio.h>

int main(int argc,char **argv,char **env)
{
  int t;

  for(t=0;env[t]!=NULL;t++) {
    printf("%s\n",env[t]);
  }
}

위 main()의 세번째 인수가 환경변수 목록 포인터입니다.
인수 목록은 argc에 의해서 카운트가 주어지는 것과는 달리 환경변수
목록은 카운트없이, 포인터배열의 마지막이 NULL포인터로 끝납니다.

위 프로그램 실행시키면 set 한것과 비슷한 내용이 나올겁니다. 단 정렬이 되어있지 않습니다.

Forums: 
musiphil의 이미지

이건 컴파일러가 따로 지원해줘야 할 겁니다.
int main(int argc,char **argv,char **env) 형태는 C 컴파일러가 보장해주는 형태가 아니거든요.

cppig1995의 이미지

표준에는 env 에 대한 정의가 없습니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

k2hyun의 이미지

얼마전에 본 c99 에 보니 env 에 대한 정의는 없더군요.

하지만, gcc 에서 지원하고 있고 저도 자주 사용하는 방법입니다. 8)

더 이상 없다.

kihlle의 이미지

표준이 정의한 방법은 extern char** environ;을 선언하는 것입니다. svid 호환이면 어떤 유닉스든 공통이며 제가 해본바로는 작동하지 않는 개발환경을 본 적이 없습니다.

homeless

cppig1995의 이미지

environ 도 표준 아니지 않나요?
제가 잘못 본 건가...

Q 11.13 - C FAQs, Steve Summit 원저, 신성국 님 한역 wrote:
(하지만, 전역 변수 environ도 비표준이기는 마찬가지입니다).

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

advanced의 이미지

kihlle wrote:
표준이 정의한 방법은 extern char** environ;을 선언하는 것입니다. svid 호환이면 어떤 유닉스든 공통이며 제가 해본바로는 작동하지 않는 개발환경을 본 적이 없습니다.

이 방법은 POSIX 에서 정의 된거구요

그 위에 **env는 전통적으로 유닉스에서 사용해 오던 방법일껍니다

예전에 어디서 본기억이 있는데 어딘지 가물가물 하네요

kihlle의 이미지

cppiq1995 wrote:
environ 도 표준 아니지 않나요?

일반적인 유닉스의 표준은 http://www.unix.orghttp://www.opengroup.org를 참조하시기 바랍니다. 일반적으로 가장 중요한 표준은 POSIX, SVID(issue3까지), AES, XPG4 이렇게 4가지입니다. (실제로 XPG4는 POSIX1,2를 포함하는 부분을 정의하므로 중복된것도 많습니다만. unistd.h에서 #ifdef _XOPEN 으로 정의된 것은 모두 XPG4를 말하는 것입니다) 그중에서도 가장 전통적인 원형은 System V표준인 svid입니다.
extern char **environ 선언에 관한것은 http://www.opengroup.org/onlinepubs/7990989775/xsh/environ.html을 참조하십시오. 비표준이 아니라 가장 전통적인 표준입니다.
advanced wrote:
이 방법은 POSIX 에서 정의 된거구요
위에서 말씀드렸듯이 포직스가 아닌 분명한 svid1의 표준이며, POSIX 1,2와 확장 모두에서 environ에 대한 언급을 본적이 없습니다. 혹시 url이라도 아시면 가르쳐주시기바랍니다.<==(수정) 이부분 틀렸습니다. opengroup의 표준안에 포함되어 있군요.(수정끝)
advanced wrote:
그 위에 **env는 전통적으로 유닉스에서 사용해 오던 방법일껍니다
어떠한 표준에서도 main()의 세번째 인자로 char*env[]를 가지는 형태를 볼수가 없습니다. 아마 말씀대로 전통적인 관습이 아닐까 생각됩니다.

먹고사는데 별 도움이 안되는 표준이야기를 하려니 피곤하군요. :D

덧붙임/
오픈그룹문서의 내용입니다.

Quote:
Some implementations provide a third argument to main() called envp. This is defined as a pointer to the environment. The ISO C standard specifies invoking main() with two arguments, so implementations must support applications written this way. Since this volume of IEEE Std 1003.1-2001 defines the global variable environ, which is also provided by historical implementations and can be used anywhere that envp could be used, there is no functional need for the envp argument. Applications should use the getenv() function rather than accessing the environment directly via either envp or environ. Implementations are required to support the two-argument calling sequence, but this does not prohibit an implementation from supporting envp as an optional third argument.

homeless

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.