プロセスの環境変数を読み取る方法

プロセスの環境変数を読み取る方法

Linuxは/proc/<pid>/environプロセス環境を更新しません。私が理解したところ、このファイルにはプロセスの初期環境が含まれています。

プロセスをどのように読みますか?現在の環境?

ベストアンサー1

あなたは読むことができます初期のプロセス環境は/proc/<pid>/environ

プロセスなら多様性環境を読み取るには、プロセスのシンボルテーブルが存在し、ptraceシステムコール(たとえばを使用して)を使用してグローバル変数gdbから環境を読み取る必要がありますchar **__environ。実行中のLinuxプロセスから変数値を取得する他の方法はありません。

これが答えです。今メモしてみてください。

上記は、プロセスがPOSIXに準拠していると仮定しています。つまり、プロセスはグローバル変数を使用して、次char **__environの環境を管理します。参考仕様

プロセスの初期環境は、プロセススタックの固定長バッファを介してプロセスに渡されます。 (これを行う一般的なメカニズムは次のとおりですlinux//fs/exec.c:do_execve_common(...)。)計算されたバッファサイズは、初期環境に必要なサイズより大きくないため、既存の変数を消去したりスタックを破壊したりせずに新しい変数を追加することはできません。したがって、プロセス環境の変更を可能にする合理的な方法は、任意のサイズのメモリを割り当てて解放できるヒープを使用することです。これはGNU libcglibc)が行うことです。

プロセスがGlibcで宣言され、プロセスヒープのメモリへのポインタで初期化され、初期環境がスタックからそのヒープ領域にコピーされると、glibcPOSIX互換です。__environプロセスがこの関数を使用するたびに、指す領域のサイズは新しい値または変数に合わせて調整されます。 (glibcソースコードをダウンロードできます)。メカニズムを実際に理解するには、Hurdコード(git clone git://git.sv.gnu.org/hurd/hurd.git hurd)も読む必要があります。glibc//posix/environ.c__environmallocsetenvglibcrealloc__environgit clone git://sourceware.org/git/glibc.git glibchurd//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.halloc_thread_info_node

最後に、POSIX__environルールは次のようになります。ユーザースペース習慣。これはLinuxカーネルのどれにも関係ありません。グローバル変数を使用せずにglibcユーザー空間プログラムを作成し、必要に応じて__environ環境変数を管理できます。このようにしても誰もあなたを逮捕しません。しかし、あなたは自分の環境管理関数(setenv/ getenv)とあなた自身のラッパーを書く必要があり、sys_execおそらくあなたが環境の変更をどこに置いたかを推測することはできません。

おすすめ記事