保護された環境変数ですか?

保護された環境変数ですか?

ユーザーや の呼び出しによって上書きできない環境変数の名前はありますかsetenv? POSIX1.2008 から理解しているところによると、どのプロセスでも環境ブロックを編集できますが、LANG などの変数の上書きは避ける必要があります。

答え1

環境は、var=value慣例により) は、execve() システム コールの3番目の引数として渡されます。

そのリストは、引数リスト( の 2 番目の引数として渡される別の文字列リスト)の場合と同様に、新しいコマンドの実行を開始するときにプロセスのスタックのどこかに配置されますexecve()

libc (ほとんど) を使用するプログラムでは、main()関数が呼び出される前に呼び出される初期化コードにより、それらの環境文字列がenviron配列として使用できるようになります。

は、プログラムが受信したリスト(のコピー)を変更できる関数と関数libcも提供します。維持され、変更されたコピーは、libc の/ / / ... 関数(それ自体がシステム コールを呼び出すことになります)を介して、プロセスまたはその子プロセスによって実行される次のコマンドに渡されます。putenvsetenvexecvp()execl()system()popen()execve()

execve()システム コールに手動で渡す文字列のリストを作成するときに、 foo(文字なし=) や=bar(空の変数名) のような文字列を渡すことはできますが、setenvではそれができません (setenv("", "bar", 1)は拒否されます)。

setenv("a=b", "c")も拒否されます。したがって、 によって定義される文字列はsetenv常に の形式になり、空にするx=yことはxできません。

これが唯一の制限です ( にも適用されますputenv)。これらは NUL で終了する文字列なので、もちろん NUL 文字は変数名や値には使用できません。

setenv("*", "x", 1)、またはカーネルsetenv("\n\n", "", 1)に関する限り、すべて問題ありませんsetenv()。ただし、これらを使用して何か有用なことを実行できるかどうかは別の問題です。

答え2

いいえ、プロセスによって変更できる環境変数に制限はありません。ただし、各プロセスには独自の自分のコピー継承された環境の、プロセスは他のプロセスの環境変数を変更できません。呼び出しsetenvは、呼び出しプロセス内の環境のみを変更できます。

答え3

export MYENV=value
readonly MYENV

答え4

それは実行しているシェルに完全に依存すると思います。

Bash では、マニュアル ページによれば、UID1 つは別のものです。BASH_VERSINFO

一方、cshではマニュアルによると環境変数を読み取り専用にすることはできません。

関連情報