2017-10-19 10 views
1

Chapter 8 of POSIX standard "널리 사용되는 명령 해석기 및 응용 프로그램에서 자주 내보내지는"일반적으로 사용되는 환경 변수의 목록을 정의합니다.어떤 C 헤더가 공통 변수 이름 (PATH, HOME, IFS ...)을 정의합니까?

그러나 어떤 유닉스 계열 시스템에서도 이름을 제공하는 C 헤더를 찾을 수 없습니다. 나는 그런 헤더를 찾을 수 있습니다

#define ENV_PATH "PATH" 
#define ENV_USER "USER" 
#define ENV_IFS "IFS" 
... 

:

내가 좋아하는 뭔가를 찾고 있어요? 모든 OS 관련 헤더가 작동합니다. 저는 상수에 대한 이름을 직접 작성하고 싶지 않습니다.

편집 만 주류 운영 체제를 사용하는 경우

, 당신은 요청할 수 있습니다 을 여기에 상수를 사용하려는 이유는 무엇입니까? $ PATH는 항상 $ PATH입니다!

이것은 사실이 아닙니다.

Plan 9 from Bell Labs에서 환경 변수는 대개 소문자입니다 (분명히 aesthetics).

Plan 9에서 파생 된 새로운 운영 체제 인 Jehanne에서 POSIX 도구의 통합을 쉽게하기 위해이 디자인 선택을 재고하고 있습니다. 그러나 소문자 환경 변수를 좋아하기 때문에 Jehanne이 "하나의 진정한 운영 체제"가 될 때 소문자 이름으로 쉽게 전환 할 수 있기를 바랍니다 .-D

+5

POSIX에는 물론 (특히) C에서도 이러한 표준 헤더가 없습니다. –

+2

아마도 programm의 시작 부분에 env 변수 이름을 얻으려고합니까? 'void main (int ac, char ** av, char ** env)'그런 다음 Path, User 및 IFS에서 루프 처리합니다. – pierreafranck

+1

왜 2자를 더 입력 하시겠습니까? PATH는 항상 PATH입니다. 변경은 결코 작동하지 않으므로이를 정의하는 데 아무런 의미가 없습니다. – Art

답변

-1

다음과 같이 할 수 있습니다. get_env_variables 함수를 사용하여 원하는 것을 수정할 수 있습니다. 이 변수를 수정하고 싶으면 strncmp 함수와 같은 함수를 작성하여 확인하십시오. 편집

int main(int ac, char **av, char **env){ 
    int i = 0; 

    while (env[i] != NULL){ 
    env[i] = get_env_variables(env[i]); 
    i++; 
    } 
} 

char *get_env_variables(char *str) { 
    // PUT SOME CODE HERE 
} 

은 : [I] 새로운 ENV를 반환 깜빡하지 않습니다.

2

주석에서 언급했듯이 응용 프로그램 및 유틸리티에서 사용되는 POSIX 지정 환경 변수 목록을 제공하는 헤더 파일은 없습니다.

"널리 사용되는 명령 인터프리터 및 응용 프로그램에서 자주 내보내는 특정 변수"목록 can be found at http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08.

ARFLAGS IFS MAILPATH PS1 
CC LANG MAILRC PS2 
CDPATH LC_ALL MAKEFLAGS PS3 
CFLAGS LC_COLLATE MAKESHELL PS4 
CHARSET LC_CTYPE MANPATH PWD 
COLUMNS LC_MESSAGES MBOX RANDOM 
DATEMSK LC_MONETARY MORE SECONDS 
DEAD LC_NUMERIC MSGVERB SHELL 
EDITOR LC_TIME NLSPATH TERM 
ENV LDFLAGS NPROC TERMCAP 
EXINIT LEX OLDPWD TERMINFO 
FC LFLAGS OPTARG TMPDIR 
FCEDIT LINENO OPTERR TZ 
FFLAGS LINES OPTIND USER 
GET LISTER PAGER VISUAL 
GFLAGS LOGNAME PATH YACC 
HISTFILE LPDEST PPID YFLAGS 
HISTORY MAIL PRINTER 
HISTSIZE MAILCHECK PROCLANG  
HOME MAILER PROJECTDIR 
:

이 자주 널리 사용되는 명령 해석기와 응용 프로그램 수출 있는 특정 변수와 충돌에 현명 (... 실제 환경 변수 목록은 포맷이 필요하지만 여기 어쨌든입니다)

환경 변수 값인 use the getenv() function에 액세스하려면 다음을 입력하십시오.

exec() function documentationchar **environ 변수 지정 또한

을이 경우 사용자에 의해 선언해야 다음 변수가 직접 사용할 수 :

extern char **environ; 

같이 초기화 환경 문자열에 대한 문자 포인터의 배열에 대한 포인터. argv 및 환경 배열은 null 포인터로 각각 으로 종료됩니다. . argv 배열을 끝내는 null 포인터는 argc에 포함되지 않습니다.

응용 프로그램은 변수를 새로운 환경 문자열에 대한 포인터 의 포인터를 가리 키도록 변수를 할당하여 전체 작업 환경을 변경할 수 있습니다. environ에 새로운 값 을 할당 한 후, 응용 프로그램은 환경 변수에 의존 getenv() 호출, putenv(), setenv(), unsetenv() 또는 어떤 함수로서 새 환경 환경의 일부가 잔존 문자열에 의존하지 않아야 수도 , 에 environ이 변경되었음을 알리는 메시지가 표시되면 환경 문자열을 새 배열로 복사하고 environ에 지정하십시오.

가변 포인트 environ이 정의되지 않은 포인터를 직접 수정하는 응용 프로그램은 정의되지 않은 동작을가집니다.

준거 멀티 스레드 애플리케이션에 액세스하거나 다른 스레드가 동시에 어떤 환경 변수를 수정하는 동안 어떤 환경 변수를 수정 environ 변수를 사용하지 않는다. 에 대한 호출은 환경 변수에 따라 변수를 사용하여 environ 변수로 간주됩니다.

+0

첫 번째 문장 만이 답을 제공합니다. 나머지는 이미 질문에 링크 된 문서를 인용하고 있습니다 ... –