보호되는 환경 변수?

보호되는 환경 변수?

사용자/호출로 덮어쓸 수 없는 환경 변수 이름이 있습니까 setenv? POSIX1.2008에서 이해했듯이 모든 프로세스는 환경 블록을 편집할 수 있지만 LANG 등과 같은 변수를 덮어쓰는 것은 피해야 합니다.

답변1

환경은 다음 형식의 문자열 목록입니다 var=value(관례에 따라)은 execve() 시스템 호출의 세 번째 인수로 전달됩니다.

해당 목록은 인수 목록( 에 두 번째 인수로 전달된 또 다른 문자열 목록)과 마찬가지로 새 명령을 실행하기 시작할 때 프로세스 스택의 어딘가에 배치됩니다 execve().

libc(대부분)를 사용하는 프로그램에서 main()함수가 호출되기 전에 호출되는 초기화 코드는 해당 환경 문자열을 environ배열로 사용할 수 있게 만듭니다.

또한 프로그램이 수신한 목록(복사본)을 수정할 수 있는 기능 도 libc제공합니다 . 유지되고 수정된 복사본은 libc의 / / / ... 함수(자체적으로 시스템 호출을 호출하게 됨 ) 를 통해 프로세스나 그 하위 항목에 의해 실행되는 다음 명령으로 전달됩니다 .putenvsetenvexecvp()execl()system()popen()execve()

이제 시스템 호출에 수동으로 전달하는 문자열 목록을 작성할 때 (문자 없이 ) 또는 (빈 변수 이름으로) execve()와 같은 문자열을 전달할 수 있지만 그렇게 할 수는 없습니다( 거부됨).foo==barsetenvsetenv("", "bar", 1)

setenv("a=b", "c")거절도 됩니다. 따라서 정의되는 문자열은 항상 비어 있을 수 없는 setenv형식입니다 .x=yx

이것이 유일한 제한사항입니다( 에서도 적용됨 putenv). NUL로 끝나는 문자열인 경우 물론 NUL 문자는 변수 이름이나 값에 나타날 수 없습니다.

setenv("*", "x", 1), 또는 커널에 관한 setenv("\n\n", "", 1)한 모두 괜찮습니다 . setenv()이제, 이를 사용하여 유용한 작업을 수행할 수 있는지 여부는 또 다른 문제입니다.

답변2

아니요. 프로세스에서 변경할 수 있는 환경 변수에는 제한이 없습니다. 하지만 각 프로세스마다 고유한 특성이 있다는 점을 명심하세요.자신의 사본상속된 환경의 프로세스이며 프로세스는 다른 프로세스의 환경 변수를 변경할 수 없습니다. 호출 setenv은 호출 프로세스 내의 환경만 수정할 수 있습니다.

답변3

export MYENV=value
readonly MYENV

답변4

나는 그것이 실행중인 쉘에 전적으로 달려 있다고 생각합니다.

Bash에서는 매뉴얼 페이지에 따라 UID하나가 다른 것입니다 .BASH_VERSINFO

반면에 매뉴얼에 따르면 csh에서는환경 변수는 읽기 전용으로 설정할 수 없습니다.

관련 정보