putenv가 제대로 동작하지 않습니다.

김경태의 이미지

#include <stdio.h>
#include <stdlib.h>

int main ()
{
  char * buffer ;
  buffer = getenv ("RESOURCES");
  if (buffer==NULL)
  {
    putenv ("RESOURCES=www.cplusplus.com");
    puts ("environment variable successfully set");
  }
  else puts ("environment variable already existed");
  return 0;
}

코드는 위와 같습니다. 그런데 매번, 성공했다는 메시지만 나올 뿐이고 실제로
확인해 보면 전혀 세팅이 되지 않았습니다.

왜 그런 것일까요?

참고로 환경을 말씀드리면,

shell : /bin/ksh
os: solaris 5.8

입니다.

고수님들의 좋은 가르침 기대하겠습니다.

체스맨의 이미지

프로세스 종료시에도 putenv 변수가 남아있길 기대하신 것이라면,
지금 처럼 전혀 셋팅되어 있지 않은 것이 정상입니다.
프로세스 내에서 셋팅한 변수에 대해 getenv 해보면 잘 나올 것입니다.

Orion Project : http://orionids.org

김경태의 이미지

과연 말씀하신대로 getenv("RESOURCES")해서 보니까 세팅한 값이 나옵니
다.

그런데 제가 원하는 것은 그 프로그램이 종료되어도 env를 통하여 RESOURCE
라는 변수안에 값이 세팅되어 있기를 바라는 것입니다.

이런 결과를 원한다면 프로그램적으로는 어떻게 하는게 바람직할까요?

고수님들의 좋은 가르침을 기대합니다.

bw001730의 이미지

첨에 쉘이 생성되구..쉘도 프로세스죠

쉘이 생성되면서
초기 스크립트에 의해 많은 환경변수들이 설정됩니다.

그리고 명령행에서... 이런 환경변수들을 이용할수 있었던것은
쉘 프로세스가 죽지 않았기 때문에... 쉘 프로세스의 메모리에 담긴
환경변수들을 이용할수 있는 것이죠.

"부모의 환경변수는 자식에게 그대로 상속된다"고 합니다
즉, fork할때 자식 프로세스의 메모리에 copy됩니다.
따라서 쉘상에서 실행한 명령들이 쉘의 환경변수를 이용할수 있습니다.
쉘상에서 실행하는 명령들은 모두 쉘의 자식프로세스들이니깐용

자식이 새로운 환경변수를 추가하면
그것은 자식의 메모리상에서만 존재하고..부모에게 없습니다.
따라서 자식이 죽으면 그걸로 끝입니다.
부모가 즉, 쉘이 그 환경변수를 얻을수 없습니다.

간단한건데 길게 쓰네요 지송합니다.

방법이 없다는것을 이해하셨죠?

정말로...그렇게 하셔야 겠다면
아래처럼 exec를 이용할수 있을것 같습니다.


아래를 a.out이라고 가정하고 말씀드리겟습니다.

main()
{
   // 환경변수 설정하는 코드 추가......
    exec(/bin/ksh) 
} 

쉘상에서 또 다른 쉘을 띄우는 코드입니다.

쉘의 자식쉘을 만드는거죠..그러면 부모쉘의 환경변수와,,

a.out의 환경변수 모두를 상속받은 쉘이 뜨게 됩니다.

이상입니다.

pynoos의 이미지

불가능합니다.

이런 이유때문에, shell script에는 "." 이나 "source" 같은 명령이 존재합니다. 현재 shell로 파싱하여 출력하라는...

아무나 모르게 뭔가를 할 수 없습니다.
실행하는 사람이 반드시 현재 쉘로 돌리는지 다른 쉘로 돌리는지를 이해해야합니다.

댓글 달기

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