FREEDOM. FRIENDS. FEATURES. FIRST. 페도라 한국 사용자 모임

putenv() vs setenv()

홈 › 게시판 › Tech/Tip › putenv() vs setenv()

  • This topic has 1개 답변, 2명 참여, and was last updated 16 years, 6 months 전에 by
    ELem. This post has been viewed 2303 times
  • #13053
    enshahar
    참가자
      게시글2 댓글1 총합3
    @parresia
     

    putenv()는 환경변수에 값을 추가할 때 사용합니다. putenv()의 문제는 인자로 넘어가는 스트링을 복사해서

    환경 변수에 등록하지 않고, 인자로 넘어가는 스트링에 대한 포인터를 환경변수로 설정한다는 점에 있습니다.

     

    만약 putenv()에 인자로 넘어가는 포인터가 스택에 할당된 자동 변수(auto variable)이라면 함수가 반환되면서

    메모리가 해제되기 때문에, 환경 변수의 값이 쓰레기값이 되거나, 잘못된 포인터로 인해 문제가 생길 수 있습니다.

    나쁜 예:

    아래 예에서 TEST 환경변수의 값은 func()를 벗어난 후에는 어떤 값이 될지 알 수 없습니다.

    int func(const char *var) {
      char env[1024];
    
      if (snprintf(env, sizeof(env),"TEST=%s", var) < 0) {
        /* Handle error */
      }
    
      return putenv(env);
    }
    

    좋은예1(putenv()에 동적 할당 메모리 사용)

    아래는 putenv에 동작 할당 메모리를 사용하는 예입니다.

    int func(const char *var) {
      static char *oldenv;
      const char *env_format = "TEST=%s";
      const size_t len = strlen(var) + strlen(env_format);
      char *env = (char *) malloc(len);
      if (env == NULL) {
        return -1;
      }
      int rc = snprintf(env, len, env_format, var);
      if (rc < 0 || (size_t)rc >= len) {
        /* Handle error */
      }
      if (putenv(env) != 0) {
        free(env);
        return -1;
      }
      if (oldenv != NULL)
        free(oldenv); /* avoid memory leak */
      oldenv = env;
      return 0;
    }
    

     

    좋은예2(setenv()사용)

    setenv()를 사용하면, 환경변수를 위해 힙에 메모리를 할당해 인자로 넘어간 스트링을 복사하게 됩니다.

    이에 따라 putenv에서 발생하는 문제가 없습니다.

    int func(const char *var) {
      return setenv("TEST", var, 1);
    }
     
0 답변 글타래를 보이고 있습니다
    • #14168
      ELem
      참가자
        게시글74 댓글709 총합783
      @Bardisch
       

      감사합니다 ㅎ

       
0 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

지금 이 순간


리눅스용으로 하드를 장만하려는데...
안녕하세요^^ 리눅스 첨 설치하는 초보입니다~
페도라12는 뭐가 문제 일까요...
페도라 F37 베타 시험기간이지만, 실제 네트워크를 통한 설치는 무난하게 잘됩니다.
가입인사드립니다
가입인사 드립니다.
넷북에서 무선랜 잡는 방법이 있을까요?
안녕하세요^^ 가입인사 올립니다~
후..너무 질긴싸움..이네요;;....
umask명령 사용법