C에서 setenv 함수를 사용하여 환경 변수에 액세스
-
setenv
함수를 사용하여 C에서 환경 변수 내보내기 -
envp
변수를 사용하여 C에서 정의 된 환경 변수를 반복합니다 -
environ
변수를 사용하여 C에서 정의 된 환경 변수를 반복합니다
이 기사에서는 C에서setenv
함수를 사용하여 환경 변수를 내보내는 몇 가지 방법을 설명합니다.
setenv
함수를 사용하여 C에서 환경 변수 내보내기
Unix 기반 시스템에서 실행되는 각 프로그램에는 주로 쉘 및 기타 사용자 공간 프로그램에서 사용하는 변수 값 쌍을 수집하는 환경이 있습니다. 프로그램은getenv
함수를 사용하여 단일 환경 변수 및 해당 값을 검색 할 수 있습니다. 그러나 새 변수를 정의하거나 기존 변수를 변경해야하는 경우setenv
함수를 호출해야합니다. 첫 번째와 두 번째 인수는 각각 변수 이름과 값을 가리키는char
포인터입니다. 세 번째 인수는int
유형이며 지정된 변수 값이 이미 환경에 존재하는 경우 덮어 써야하는지 여부를 지정합니다. 이 인수의 0이 아닌 값은 덮어 쓰기 동작과 그 반대의 값이 0임을 나타냅니다.
그러나 정의 된 모든 환경 변수를 반복하려면 NULL로 끝나는 문자열 배열 인environ
이라는 특수 전역 변수에 액세스해야합니다. 또는 변수에 액세스하기 위해 세 번째 인수envp
를 사용하여main
함수를 선언 할 수 있습니다. 다음 예에서는setenv
함수 호출 전후에eniron
및envp
포인터를 모두 인쇄합니다. 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
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