source

C에서 환경 변수 설정

nicesource 2023. 6. 8. 19:54
반응형

C에서 환경 변수 설정

리눅스에서 C를 사용하여 환경 변수를 설정할 수 있는 방법이 있습니까?

나는 노력했다.setenv()그리고.putenv()하지만 그들은 저를 위해 일하지 않는 것 같습니다.

제가 여기서 추측해 보겠습니다만, 이러한 기능이 작동하지 않는 것처럼 보이는 일반적인 이유는 작동하지 않기 때문이 아니라 사용자가 환경 변수가 작동하는 방식을 제대로 이해하지 못하기 때문입니다.예를 들어 이 프로그램이 있는 경우:

int main(int argc, char **argv)
{
  putenv("SomeVariable=SomeValue");
  return 0;
}

그리고 나서 저는 그것을 셸에서 실행합니다. 그것은 셸의 환경을 수정하지 않습니다. 아이 프로세스가 그렇게 할 수 있는 방법은 없습니다.이러한 이유로 환경을 수정하는 셸 명령이 내장되어 있으며, 이를 위해source셸에 추가할 변수 설정을 포함하는 스크립트입니다.

모든 유닉스 프로그램은 그것을 시작하는 프로세스와 별도의 프로세스에서 실행됩니다. 이것은 '하위' 프로세스입니다.

프로그램이 시작되면(명령줄이든 다른 방식이든) 시스템은 상위 프로세스의 복사본인 새 프로세스를 만듭니다.이 복사본은 부모 프로세스에 환경 변수를 포함하며, 이것이 자식 프로세스가 부모 프로세스의 환경 변수를 '상속'하는 메커니즘입니다.(이것은 대부분 여기에 있는 다른 답변들이 말한 것입니다.)

즉, 공정은 자체 환경 변수만 설정합니다.

다른 사람들은 현재 프로세스에서 환경 변수를 설정하는 방법으로 셸 스크립트를 소싱하는 것을 언급했지만, 현재(쉘) 프로세스에서 변수를 프로그래밍 방식으로 설정해야 하는 경우에는 약간 간접적인 방법이 있습니다.

고려 사항:

% cat envs.c
#include <stdio.h>
int main(int argc, char**argv)
{
    int i;
    for (i=1; i<argc; i++) {
        printf("ENV%d=%s\n", i, argv[i]);
    }
}
% echo $ENV1

% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
% 

빌트인eval에서는 셸 프롬프트에서 해당 인수가 입력된 것처럼 인수를 평가합니다.이것은 sh 스타일의 예입니다. csh 스타일의 변형은 연습으로 남겨집니다!

setenv()/putenv()에 의해 설정된 환경 변수는 이러한 기능을 실행한 프로세스에 대해 설정되며 해당 프로세스에 의해 시작된 프로세스에 의해 상속됩니다.그러나 프로그램을 실행한 셸에는 브로드캐스트되지 않습니다.

setenv() 주변의 래퍼가 작동하지 않는 이유는 무엇입니까?

환경 블록은 프로세스 로컬이며 하위 프로세스에 복사됩니다.따라서 변수를 변경하면 새 값은 변경 후 생성된 프로세스와 하위 프로세스에만 영향을 미칩니다.확실히 그것은 당신이 발사한 셸을 바꾸지 않을 것입니다.

질문에 대한 대답이 아니라, 단지 말하고 싶은 것입니다.putenv 위합니다를 사용하세요. 사용하십시오.setenv대신.

putenv(char *string)키-값 쌍 문자열의 주소만 추가하면 되기 때문에 위험합니다.environ가 가리키는 . 따라서, 만약 우리가 나중에 지적한 바이트를 수정한다면.string변경사항은 프로세스 환경에 영향을 미칩니다.

#include <stdlib.h>

int main(void) {
    char new_env[] = "A=A";
    putenv(new_env);

    // modifying your `new_env` also modifies the environment
    // vairable
    new_env[0] = 'B';
    return EXIT_SUCCESS;
}

때부터environ▁of.string 논쟁,string포인터가 매달리지 않도록 하려면 정적이어야 합니다.

#include <stdlib.h>

void foo();

int main(void) {
    foo();
    return EXIT_SUCCESS;
}

void foo() {
    char new_env[] = "A=B";
    putenv(new_env);
}

다음에 대한 스택 프레임이foo되었습니다. 수는 " " " 입니다. 바이트 수:new_env, 는 사졌고저장었습다니되주가라에 되어 있습니다.environ달링 포인터가 됩니다.

언급URL : https://stackoverflow.com/questions/3416638/set-environment-variables-in-c

반응형