사용자/호출로 덮어쓸 수 없는 환경 변수 이름이 있습니까 setenv
? POSIX1.2008에서 이해했듯이 모든 프로세스는 환경 블록을 편집할 수 있지만 LANG 등과 같은 변수를 덮어쓰는 것은 피해야 합니다.
답변1
환경은 다음 형식의 문자열 목록입니다 var=value
(관례에 따라)은 execve() 시스템 호출의 세 번째 인수로 전달됩니다.
해당 목록은 인수 목록( 에 두 번째 인수로 전달된 또 다른 문자열 목록)과 마찬가지로 새 명령을 실행하기 시작할 때 프로세스 스택의 어딘가에 배치됩니다 execve()
.
libc(대부분)를 사용하는 프로그램에서 main()
함수가 호출되기 전에 호출되는 초기화 코드는 해당 환경 문자열을 environ
배열로 사용할 수 있게 만듭니다.
또한 프로그램이 수신한 목록(복사본)을 수정할 수 있는 기능 도 libc
제공합니다 . 유지되고 수정된 복사본은 libc의 / / / ... 함수(자체적으로 시스템 호출을 호출하게 됨 ) 를 통해 프로세스나 그 하위 항목에 의해 실행되는 다음 명령으로 전달됩니다 .putenv
setenv
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에서는환경 변수는 읽기 전용으로 설정할 수 없습니다.