![보호되는 환경 변수?](https://linux55.com/image/38180/%EB%B3%B4%ED%98%B8%EB%90%98%EB%8A%94%20%ED%99%98%EA%B2%BD%20%EB%B3%80%EC%88%98%3F.png)
사용자/호출로 재정의할 수 없는 환경 변수 이름이 있습니까 setenv
? POSIX1.2008에서 내가 아는 한, 모든 프로세스는 환경 블록을 편집할 수 있지만 LANG과 같은 변수를 덮어쓰는 것을 피해야 합니다.
답변1
환경은 다음 형식의 문자열 목록입니다 var=value
(관례에 따르면)은 execve() 시스템 호출의 세 번째 인수로 전달됩니다 .
execve()
프로세스가 새 명령 실행을 시작하면 이 목록은 인수 목록(두 번째 인수로 전달되는 또 다른 문자열 목록 ) 과 마찬가지로 프로세스 스택의 어딘가에 배치됩니다 .
libc(대부분)를 사용하는 프로그램에서는 main()
이러한 환경 문자열을 배열로 사용할 수 있도록 함수를 호출하기 전에 초기화 코드가 호출됩니다 environ
.
또한 libc
프로그램이 받은 목록(복사본)을 수정하는 기능도 제공합니다 putenv
. 유지되고 수정된 복사본은 setenv
libc의 // / ... 함수(최종적으로 시스템 호출을 호출함)를 통해 프로세스나 그 하위 항목에 의해 실행되는 다음 명령으로 전달됩니다.execvp()
execl()
system()
popen()
execve()
이제 시스템 호출에 수동으로 전달되는 문자열 목록을 작성할 때 ( 문자 없음) 또는 (빈 변수 이름 사용)과 execve()
같은 문자열을 전달할 수 있지만 그렇게 할 수는 없습니다( 거부됨).foo
=
=bar
setenv
setenv("", "bar", 1)
setenv("a=b", "c")
거절도 됩니다. 따라서 로 정의된 문자열은 항상 비어 있을 수 없는 형식입니다 setenv
.x=y
x
이것이 유일한 한계입니다(또한 에 의한 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에서는환경 변수는 읽기 전용으로 설정할 수 없습니다.