이 질문에는 다음이 포함됩니다.이 답변.
하위 프로세스를 생성하고 초기 환경 변수를 확인하여 프로세스의 현재(초기 아님) 환경 변수를 가져올 수 있습니까?
아이디어는 하위 프로세스의 초기 환경이 상위 프로세스의 현재 환경에서 상속된다는 것입니다.
답변1
execve
환경은 인수 목록과 마찬가지로 시스템 호출을 통해 전달되는 문자열 목록입니다 . 기간. 애플리케이션이 수신한 문자열 목록을 처리하는 방법은 애플리케이션에 달려 있습니다.
이제 관례에 따라 이 목록은 일반적으로 인수 목록과 다르게 사용됩니다. 프로그램은 수신한 환경 변수 목록을 기억하고 다른 명령을 실행할 때 동일한 환경 변수를 재사용하는 경우가 많습니다.
이를 수행하는 데 도움이 되는 C 라이브러리 함수가 있습니다. 환경은 변수로 제공되며, environ
, , 및 getenv
, , , ... 실행 명령 중(추적 중인 변수를 사용하여 호출됨)setenv
putenv
execvp
execl
system
popen
environ
execve
environ
이제 애플리케이션은 이 API를 사용할 필요가 없습니다. 그들은 자신만의 방법을 사용하여 환경 변수 목록을 관리할 수 있습니다. 예를 들어, 쉘은 환경 변수를 쉘 변수에 매핑하고 putenv/setenv libc 함수를 사용하지 않을 수 있습니다. 연관 배열 등이 perl
있습니다 .%ENV
항상 gdb
프로세스에 연결을 사용하여 호출하도록 할 수 있지만(libc에 동적으로 연결되어 있다고 가정) 명령에 연결하면 다른 명령과 동일한 환경을 확보하여 자체 방식으로 실행할 수 system("env > /tmp/some-file")
있다는 보장이 없습니다. env
(예: 쉘을 고려하십시오). (또한 system()
쉘이 시작되고(명령줄이 해석됨) 쉘은 시작 시 환경을 변경할 수 있습니다(예: try env -i sh -c env
).
$ sleep 100 &
[1] 17098
$ gdb --pid=$! /bin/sleep
[...]
(gdb) p environ[0]
$1 = 0x7fffd722d227 "STY=7498.pts-0.hostname"
(gdb) p environ[1]
$2 = 0x7fffd722d245 "TERM=screen-bce"
(gdb) call system("env > /tmp/some-file")
$4 = 0
(gdb) detach
Detaching from program: /bin/sleep, process 17098
(gdb) quit
$ cat /tmp/some-file
GNOME_KEYRING_PID=6850
SSH_AGENT_PID=6844
SHLVL=1
[...]
답변2
Linux 또는 파일 시스템이 있는 Unix 중 하나를 실행 중인 경우 /proc
프로세스 환경은 에 있습니다 /proc
. 현재는 Solaris 시스템에 액세스할 수 없지만 Linux에서는 다음과 같이 작동합니다.
$ tr '\0' '\n' < /proc/$$/environ
현재 쉘의 환경 변수를 인쇄하지만 $$
사용자 ID가 액세스할 수 있는 모든 프로세스 ID가 될 수 있습니다.
Solaris에서 이를 수행하는 방법이 있지만 훨씬 더 복잡합니다. BSD는 Linux와 더 유사하다고 생각합니다 /proc
.