2015-01-17 4 views
0

현재 프로그램을 작성 중이며 환경 변수가 설정된 경우 특수 출력을 인쇄하려고합니다.C 프로그램에서 환경 변수가 설정되었는지 확인하는 방법

예를 들어, 환경 변수 "DEBUG"을 원한다고 가정 해보십시오. 내 bash는 명령 프롬프트에서

, 나는 명령을 입력하여 DEBUG을 설정 DEBUG=

그런 다음 내 C 프로그램에서,이 환경 변수가 char **environ의 모든 컨텐츠를 인쇄하여 설정되어 있는지 확인 할 수 있습니다. DEBUG이이 환경 출력물에 표시됩니다.

그러나 조건부 검사를 위해이 환경 변수를 검색하는 방법을 모르겠습니다. 심지어 알려진에이 시도

printf("get env: %s\n", getenv("DEBUG")); 

: 내가 독방 감금 오류를 얻을 아래와 같이이 출력을 인쇄하려고한다면

getenv("DEBUG") 

: 그래서 같은 기능의 GetEnv를 사용하여 시도했다 "HOME" :

printf("get env: %s\n", getenv("HOME")); 

과 같은 환경 변수는 여전히 seg fault를 생성합니다.

C 프로그램에서 환경 변수가 설정되어 있는지 확인하는 사람이 있습니까? 나도 그렇게하지 못하게하는 하나의 환경 변수를 가져 오는 문제가있다.

+0

사용중인 운영 체제는 무엇입니까? –

+0

OSX에 있지만 유닉스/리닉스 서버에서도 테스트 중입니다 – pleaver

답변

4

getenv은 묻는 환경 변수가 설정되지 않은 경우 NULL을 반환합니다. 따라서 수표는 간단히 수 있습니다

if(getenv("DEBUG")) { 
    // DEBUG is set 
} else { 
    // DEBUG is not set 
} 

셸과 환경 변수 사이에 차이점이 있습니다. 당신이 변수가 쉘의 서브 프로세스의 환경에 표시하려는 경우, 당신은 쉘에서 export에 있습니다

export DEBUG=some_value 

또는

DEBUG=some_value 
export DEBUG 

그냥 DEBUG=some_value 말을하는 것만으로는 충분하지 않습니다.

+0

'getenv ("HOME"); '으로 세그먼테이션 결함을 어떻게 설명 할 수 있습니까? –

+2

그는 NULL로 문자열을 인쇄하고 있습니다. – Wintermute

+0

'getenv ("HOME")'은'NULL'을 반환하지 않을 것입니다. 그리고 OP가'glibc'를 사용하여 리눅스에 있다고 의심합니다. printf ("% s \ n", NULL);' (null)'. –

2

getenv (및 printf)을 올바르게 선언해야합니다.

getenv를 들어, 당신이 필요합니다 당신이 그것을 선언하지 않으면 당신이 그것을 호출 할 때

#include <stdlib.h> 

은, 세그먼테이션 폴트 (segfault) 가능성이 있습니다. 만약 당신이 그것을 얻으 려한다면, 그것이 반환하는 가치를 사용하려고 시도하는 것은 아마 또한 실패 할 것입니다.

선언되지 않은 함수는 정수 또는 double 인수 (제공되는 내용에 따라 다름)를 받아들이는 것처럼 처리되며 정수를 반환하는 것처럼 처리됩니다.int이 포인터와 같은 크기이면 작동 할 수도 있지만 일반적으로 포인터가 64 비트이지만 int가 32 인 일반적인 경우 포인터를 정수처럼 전달하면 비트의 절반이 바닥으로 포인터로 사용하기가 거의 불가능합니다.

항상 코드를 컴파일 할 때 -Wall을 지정하고 경고에 유의해야합니다. 그것들은 중요합니다.

+0

나는 이것이 문제라고 생각하고있었습니다 ... –

+0

@iharob : Given 64 비트 포인터와 32 비트 정수를 사용하는 경우 포인터를 인수로 사용하는 선언되지 않은 함수를 호출하면 segfault가 거의 불가피합니다. 기본 'int'변환은 포인터에서 상위 비트를 삭제하기 때문입니다. – rici

+0

I now ... 그리고 기본 반환 int 문제에 대해서는 언급하지 않았으므로이를 해결하기 위해 새로운 대답을 추가했습니다. –

2

stdlib.h이 포함되어 있지 않고 컴파일러가 getenv()을 반환한다고 가정하기 때문에 int을 반환합니다.

당신은 당신이

char *getenv(const char *); 

같은 getenv()을 선언 할 수 있습니다, 두 가지 옵션이 있습니다 또는 stdlib.h을 포함하고, 같은 printf() 적용하지만,이 경우 헤더는 stdio.h입니다.

이 경우 컴파일을 방지 할 수 리눅스 gccclang 모두 지원 -Wall -Wextra -Werror, 가장 중요한, -Werror을에, 컴파일러 경고를 사용하도록 설정해야합니다.

0

코드 :

if(NULL == getenv("TIME_ELAPSED")) 
    { 
     putenv("TIME_ELAPSED=1"); 
    } 

우리가하는 putenv 오류 처리를 돌봐이 또한 새로운 환경을 할당 할 부족하다 공간을 반환 .Sometimes.

관련 문제