保護された環境変数?

保護された環境変数?

ユーザー/呼び出しでオーバーライドできない環境変数名はありますかsetenv? POSIX1.2008で私が知っている限り、すべてのプロセスは環境ブロックを編集できますが、LANGなどの変数を上書きすることを避ける必要があります。

ベストアンサー1

環境は、次の形式の文字列のリストですvar=value慣例によると)はexecve()システムコールの3番目の引数として渡されます。

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

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

また、libcプログラムが受信したリスト(コピー)を変更する機能も提供しますputenv。保持され変更されたコピーは、setenvlibcの/ / / ...関数(最後にシステムコールを呼び出す)を介してプロセスまたはその子孫によって実行される次のコマンドに渡されます。execvp()execl()system()popen()execve()

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

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

これが唯一の限界です(またによるputenv)。これはNULで終わる文字列であり、もちろんNUL文字は変数名または値には現れません。

setenv("*", "x", 1)、またはカーネルに関する限りsetenv("\n\n", "", 1)setenv()今、これで役に立つことができるかどうかは別の話です。

おすすめ記事