프로세스의 현재 환경 변수

프로세스의 현재 환경 변수

이 질문에는 다음이 포함됩니다.이 답변.

하위 프로세스를 생성하고 초기 환경 변수를 확인하여 프로세스의 현재(초기 아님) 환경 변수를 가져올 수 있습니까?

아이디어는 하위 프로세스의 초기 환경이 상위 프로세스의 현재 환경에서 상속된다는 것입니다.

답변1

execve환경은 인수 목록과 마찬가지로 시스템 호출을 통해 전달되는 문자열 목록입니다 . 기간. 애플리케이션이 수신한 문자열 목록을 처리하는 방법은 애플리케이션에 달려 있습니다.

이제 관례에 따라 이 목록은 일반적으로 인수 목록과 다르게 사용됩니다. 프로그램은 수신한 환경 변수 목록을 기억하고 다른 명령을 실행할 때 동일한 환경 변수를 재사용하는 경우가 많습니다.

이를 수행하는 데 도움이 되는 C 라이브러리 함수가 있습니다. 환경은 변수로 제공되며, environ, , 및 getenv, , , ... 실행 명령 중(추적 중인 변수를 사용하여 호출됨)setenvputenvexecvpexeclsystempopenenvironexecveenviron

이제 애플리케이션은 이 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.

관련 정보