programing

getenv는 표준화되었지만 setenv는 아닌 이유는 무엇입니까?

starjava 2023. 10. 24. 20:03
반응형

getenv는 표준화되었지만 setenv는 아닌 이유는 무엇입니까?

이 질문에 대한 답변과 의견을 들어보면 C++ 표준에 의해 정의된 것으로 알고 있지만,setenv아닙니다.그리고 정말로, 다음 프로그램입니다.

#include <cstdlib>
#include <iostream>

int main ( int argc, char **argv )
{
    std::cout << std::getenv("PATH") << std::endl;  // no errors

    std::setenv("PATH", "/home/phydeaux/.local/bin:...", true);  // error
}

컴파일하지 않습니다(3.9항).

보완적으로 보이는 기능 중 하나는 표준화되었지만 다른 하나는 표준화되지 않은 이유는 무엇입니까?

C90 표준에는 다음이 포함되어 있으므로 C++98 표준도 마찬가지입니다.

C 표준이 처음 만들어졌을 때, 환경 설정에 대한 선례는 다음과 같습니다; 기능은 나중까지 고안되지 않았습니다.표준 위원회는 가능할 때 새로운 기능을 생성하는 것을 피했지만, 가능할 때 문제가 있는 기능을 표준화하는 것도 피했습니다(예, 그리고 그 반대 사례).의 행동.putenv()문제가 있습니다.자동 지속 시간이 아닌 메모리를 전달해야 하지만, 다시는 사용할 수 있는지 알 수 없습니다.강제로 메모리가 유출된 것과 같습니다.s a ™ A Good Thin™™putenv()표준화되지 않았습니다.

C 표준의 근거는 다음과 같이 명시적으로 말합니다( §7.20.4.5, p163).

해당되는putenv함수는 다중 프로세스 환경 외부의 효용성이 의심스럽기 때문에 표준에서 빠졌습니다. 그리고 그 정의가 운영 체제 표준의 영역이기 때문입니다.

플랫폼별 API가 개입하여 누락된 기능을 적합한 방식으로 제공합니다.


POSIX 표준의 첫 번째 버전(1988년 시험 사용; 1990년)은 다음을 포함하지 않았습니다.setenv()아니면putenv(). X/Open Portability Guide(XPG) 1호는 다음을 포함하고 있습니다.putenv()SVID(System V Interface Definition)에 포함되지 않은 SVID(System V Interface Definition)의 외관에 기반합니다.setenv(). XPG 6호setenv()그리고.unsetenv()(에 링크된 URL의 기능에 대해서는 이력 섹션을 참조하십시오.)맥OS라 10.12를 6을 실행하는 맥에서는man 3 setenv에는 다음을 식별하는 이력 섹션이 있습니다.

함수 setenv()와 unsetenv()는 버전 7 AT&T UNIX에 등장했습니다.putenv() 함수는 4.3에 나타남BSD-Reno.

UNIX 프로그래머 매뉴얼 제1권(1979)에는 다음과 같은 내용이 포함되어 있지 않기 때문에 예상치 못한 오류일 수 있습니다.putenv(),setenv()아니면unsetenv().putenv()기능은 80년대 어느 단계에서 유닉스의 AT&T 변종에 추가되었습니다. SVID에 있었고 SVR4가 1990년에 출시되었을 때 문서화되었으며 시스템 III의 일부였을 수 있습니다.플랫폼이 거의 뒤바뀐 것 같아요. 4.3BSD-Reno는 최초의 C와 POSIX 표준이 발표된 후 1990년 6월에 출시되었습니다.

Random832에서는 TUHSUnix Heritage Society를 고대 버전의 Unix에 대한 정보의 출처로 언급하는 등의 논의가 있었습니다.그 사슬에는 내가 관찰한 내용이 포함되어 있었습니다.다른 것이 아니라면, 이 토론은 왜 표준 위원회들이 '환경 설정'에서 벗어나도록 잘 했는지를 강조합니다. 제 기억과는 달리 제 7판 UNIX에는 없었던 것으로 보입니다. 1983년부터 사용한 시스템에서 사용할 수 있었다고 확신합니다. 시스템 III의 일부 자료와 PWB의 일부 자료가 포함된 많은 7판이었습니다. SVR4의 일부이며, SVID의 일부 버전(아마도 SVR4 이전)에 정의되어 있습니다.VR4 이전)에서 정의되었습니다.

C 근거는 또한 다음과 같은 우려를 언급합니다.gets()그러나 그러한 우려에도 불구하고 이를 포함시켰습니다. 물론 C11에서 제거되었습니다(그러나 POSIX는 여전히 C11이 아닌 C99를 가리킵니다).

일부 원래 환경에서는 setenv를 사용할 수 없습니다.C에 대해 정의되었습니다.

getenv를 사용하면 환경을 볼 수 있습니다. exec[lv][p][e]를 사용하여 새 프로세스를 생성하면 상속되거나 새 환경이 있는 자식을 생성할 수 있습니다.

그러나 setenv는 항상 가능하지는 않았던 호출 프로세스의 상태를 수정합니다.

발신자에게 쓰기 가능한 인터페이스가 증가하고, 원래 필요하지 않았던 것이 아니라 요즘 보안 위험이 되고 있기 때문인 것 같습니다.

언급URL : https://stackoverflow.com/questions/45938604/why-was-getenv-standardised-but-not-setenv

반응형