보호되는 환경 변수?

보호되는 환경 변수?

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

답변1

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

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

libc(대부분)를 사용하는 프로그램에서는 main()이러한 환경 문자열을 배열로 사용할 수 있도록 함수를 호출하기 전에 초기화 코드가 호출됩니다 environ.

또한 libc프로그램이 받은 목록(복사본)을 수정하는 기능도 제공합니다 putenv. 유지되고 수정된 복사본은 setenvlibc의 // / ... 함수(최종적으로 시스템 호출을 호출함)를 통해 프로세스나 그 하위 항목에 의해 실행되는 다음 명령으로 전달됩니다.execvp()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에서는환경 변수는 읽기 전용으로 설정할 수 없습니다.

관련 정보