Linuxは/proc/<pid>/environ
プロセス環境を更新しません。私が理解したところ、このファイルにはプロセスの初期環境が含まれています。
プロセスをどのように読みますか?現在の環境?
ベストアンサー1
あなたは読むことができます初期のプロセス環境は/proc/<pid>/environ
。
プロセスなら多様性環境を読み取るには、プロセスのシンボルテーブルが存在し、ptrace
システムコール(たとえばを使用して)を使用してグローバル変数gdb
から環境を読み取る必要がありますchar **__environ
。実行中のLinuxプロセスから変数値を取得する他の方法はありません。
これが答えです。今メモしてみてください。
上記は、プロセスがPOSIXに準拠していると仮定しています。つまり、プロセスはグローバル変数を使用して、次char **__environ
の環境を管理します。参考仕様。
プロセスの初期環境は、プロセススタックの固定長バッファを介してプロセスに渡されます。 (これを行う一般的なメカニズムは次のとおりですlinux//fs/exec.c:do_execve_common(...)
。)計算されたバッファサイズは、初期環境に必要なサイズより大きくないため、既存の変数を消去したりスタックを破壊したりせずに新しい変数を追加することはできません。したがって、プロセス環境の変更を可能にする合理的な方法は、任意のサイズのメモリを割り当てて解放できるヒープを使用することです。これはGNU libc
(glibc
)が行うことです。
プロセスがGlibcで宣言され、プロセスヒープのメモリへのポインタで初期化され、初期環境がスタックからそのヒープ領域にコピーされると、glibc
POSIX互換です。__environ
プロセスがこの関数を使用するたびに、指す領域のサイズは新しい値または変数に合わせて調整されます。 (glibcソースコードをダウンロードできます)。メカニズムを実際に理解するには、Hurdコード(git clone git://git.sv.gnu.org/hurd/hurd.git hurd)も読む必要があります。glibc//posix/environ.c
__environ
malloc
setenv
glibc
realloc
__environ
git clone git://sourceware.org/git/glibc.git glibc
hurd//init/init.c:frob_kernel_process()
fork
その後、スタックを上書きせずにexec
新しいプロセスが作成されると()を呼び出して、新しいプロセスのスタックを割り当てるルーチン呼び出しでlinux//kernel/fork.c:do_fork(...)
引数copy_process
と環境コピーマジックが実行されます。次に、次をdup_task_struct
使用して新しいプロセスにスタックをalloc_thread_info_node
割り当てます。呼ぶsetup_thread_stack
()。linux//include/linux/sched.h
alloc_thread_info_node
最後に、POSIX__environ
ルールは次のようになります。ユーザースペース習慣。これはLinuxカーネルのどれにも関係ありません。グローバル変数を使用せずにglibc
ユーザー空間プログラムを作成し、必要に応じて__environ
環境変数を管理できます。このようにしても誰もあなたを逮捕しません。しかし、あなたは自分の環境管理関数(setenv
/ getenv
)とあなた自身のラッパーを書く必要があり、sys_exec
おそらくあなたが環境の変更をどこに置いたかを推測することはできません。