グローバル環境変数とfork()とexec()に関する質問

グローバル環境変数とfork()とexec()に関する質問

私が理解したいのは、親プロセスがエクスポートした変数を子プロセスが継承する場所です。

私が知りたいのは、エクスポートされた環境変数を子プロセスが継承する場所です。 exec()システムコールがfork()によって生成された環境変数を上書きすることを理解しています...しかし、すべての環境変数がオーバーライドされると、exec()はどのようにエクスポートした環境変数を新しく作成されたサブプロセスに含めるのですか? ?私の推測は、エクスポートされた環境変数が何らかの方法で上書きの対象から除外されることです。しかし、これを確認することはできません。

編集する私の要件をより明確に表現するために質問を編集しました。

答え1

グローバル環境変数はありません。彼らは両親から子供に渡されます。

  • fork環境変数は変更されません。
  • exece事後修正は環境変数を変更しません。
  • exec変更後のe上書き環境変数。

環境を変更するためにe末尾のsを使用することに加えて、次のこともできます。exec

int pid = fork() //new process with same environment variables
if (pid == 0) {
    putenv   //add some environment variables
    unsetenv //remove some environment variables
    exec     //replace program. non e version of exec.
} …

答え2

int execve(const char *filename, char *const argv[],
           char *const envp[]);

-人々は処刑する

このenvpパラメーターは次のものを提供します。みんなプログラムを実行するための環境変数です。に値を渡さないと、envp実行プログラムは環境変数をまったく表示できません。

環境変数()を読み取るときは、getenv()常に現在のプロセスから読み取ってください。

システム全体の環境変数を設定できません。子プロセスに渡す変数を設定して、初期プロセスの環境のみを構成できます。

わかりました。可能まったく異なる環境で別のプログラムを起動してください。しかし、最も広く使用され、一般的なルールは、独自の環境コピーを使用してプログラムを起動することです。必要に応じて特定の環境変数を変更できます。

1つの例外は環境を完全にリセットすることsu --loginです。これらのコマンドのオプションをsudo --login ...省略すると、--login一部の環境変数が渡され、時には「予期しない結果」が発生する可能性があります。

関連情報