C에서 setenv 함수를 사용하여 환경 변수에 액세스

Jinku Hu 2023년10월12일
  1. setenv함수를 사용하여 C에서 환경 변수 내보내기
  2. envp변수를 사용하여 C에서 정의 된 환경 변수를 반복합니다
  3. environ변수를 사용하여 C에서 정의 된 환경 변수를 반복합니다
C에서 setenv 함수를 사용하여 환경 변수에 액세스

이 기사에서는 C에서setenv함수를 사용하여 환경 변수를 내보내는 몇 가지 방법을 설명합니다.

setenv함수를 사용하여 C에서 환경 변수 내보내기

Unix 기반 시스템에서 실행되는 각 프로그램에는 주로 쉘 및 기타 사용자 공간 프로그램에서 사용하는 변수 값 쌍을 수집하는 환경이 있습니다. 프로그램은getenv함수를 사용하여 단일 환경 변수 및 해당 값을 검색 할 수 있습니다. 그러나 새 변수를 정의하거나 기존 변수를 변경해야하는 경우setenv함수를 호출해야합니다. 첫 번째와 두 번째 인수는 각각 변수 이름과 값을 가리키는char포인터입니다. 세 번째 인수는int유형이며 지정된 변수 값이 이미 환경에 존재하는 경우 덮어 써야하는지 여부를 지정합니다. 이 인수의 0이 아닌 값은 덮어 쓰기 동작과 그 반대의 값이 0임을 나타냅니다.

그러나 정의 된 모든 환경 변수를 반복하려면 NULL로 끝나는 문자열 배열 인environ이라는 특수 전역 변수에 액세스해야합니다. 또는 변수에 액세스하기 위해 세 번째 인수envp를 사용하여main함수를 선언 할 수 있습니다. 다음 예에서는setenv함수 호출 전후에enironenvp포인터를 모두 인쇄합니다. envp포인터는 호출 후 동일한 값을 갖는 반면environ은 변경되었습니다.

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

extern char **environ;

int main(int argc, const char *argv[], const char *envp[]) {
  printf("environ:  %p\n", environ);
  printf("envp:     %p\n", envp);

  setenv("NEW_VAR", "new_value", 1);

  puts("----Added NEW_VAR----");
  printf("environ:  %p\n", environ);
  printf("envp:     %p\n", envp);

  exit(EXIT_SUCCESS);
}

출력:

environ:  0x7fffa05a7fe8
envp:     0x7fffa05a7fe8
----Added NEW_VAR----
environ:  0x5646431276b0
envp:     0x7fffa05a7fe8

envp변수를 사용하여 C에서 정의 된 환경 변수를 반복합니다

이전 코드 예제는setenv함수를 호출 한 후main함수 인수envp를 사용하여 환경 변수를 검색하지 않아야하는 이유를 보여줍니다. setenv함수가 호출되면 환경이 재배치되지만envp는 여전히 이전 환경을 가리 킵니다. 다음 예제 코드는setenv호출로 새 변수를 정의한 후envp포인터 배열을 반복하여 잘못된 동작을 보여줍니다. 또한NEW_VAR이라는 변수가 발견되면goto문을 사용하여 루프의 끝으로 이동합니다.

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

int main(int argc, const char *argv[], const char *envp[]) {
  if (setenv("NEW_VAR", "new_value", 1) != 0) {
    perror("setenv");
    exit(EXIT_FAILURE);
  }

  if (envp != NULL) {
    for (size_t i = 0; envp[i] != NULL; ++i) {
      if (strcmp(envp[i], "NEW_VAR=new_value") == 0) {
        puts(envp[i]);
        goto END;
      }
    }
    printf("No such variable found!\n");
  }
END:

  exit(EXIT_SUCCESS);
}

출력:

No such variable found!

environ변수를 사용하여 C에서 정의 된 환경 변수를 반복합니다

이전 솔루션은 새로 정의 된 변수를 찾을 수 없으므로 외부에서 선언 된environ변수를 사용해야합니다. 이 경우 여러 시스템에서 코드를 이식 할 수 있도록 여러 전 처리기 조건문을 포함했지만 대부분의 UNIX 기반 시스템에서는extern char ** environ만 필요합니다. 일단 선언되면 이전 예제에서 구현 한 것과 동일한 루프를 사용하여 변수 목록을 반복 할 수 있습니다.

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

#if defined(_POSIX_) || defined(__USE_POSIX)
extern char **environ;
#elif defined(_WIN32)
_CRTIMP extern char **_environ;
#endif

int main(void) {
  if (setenv("NEW_VAR", "new_value", 1) != 0) {
    perror("setenv");
    exit(EXIT_FAILURE);
  }

  if (environ != NULL) {
    for (size_t i = 0; environ[i] != NULL; ++i) {
      if (strcmp(environ[i], "NEW_VAR=new_value") == 0) {
        puts(environ[i]);
        goto END;
      }
    }
    printf("No such variable found!\n");
  }
END:

  exit(EXIT_SUCCESS);
}

출력:

NEW_VAR=new_value
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook