いいえ、親アプリケーション環境を変更することはできません。
なんで?親アプリが(おそらくを使用してsystem()
)起動したとき、実際にはfork()
ed-子プロセスは親のほぼ正確なレプリカとして生まれ、次にその子はexecve()
呼び出しを使用し、そのプロセスの実行可能イメージをアプリケーションの実行可能イメージに完全に置き換えました(スクリプトの場合は、bashのようなインタプリタのイメージになります)。
それに加えて、そのプロセスはさらにいくつかのものを準備しました。1つは、ファイルハンドル0、1、2(stdin、stdout、stderr)で始まる開いているファイルのリストです。また、環境変数(キー=値のペアとして)を含むメモリブロック(子プロセスのアドレス空間に属する)を作成しました。
環境ブロックはプロセスに属しているため、必要に応じて独自の環境を変更できます。ただし、プロセスが親の環境メモリブロック(またはその他のプロセス)を変更することはできません。これを実現する唯一の方法は、IPC(プロセス間通信)を使用して、親にその内部でこのタスクを実行するように優しく依頼することですが、親は(ローカルまたはネットワークソケットで)積極的にリッスンしており、そのような要求を喜んで実行する必要があります誰かから、そして子供はその点で他のプロセスと比較して特別なものではありません。
これは、シェルスクリプトを使用してbashの環境を変更できる理由でもありますが、外部プロセスを開始せずにbash自体によって処理されるため、source
またはbashマクロのみを使用します。.
ただし、上記の理由により、他のプログラムやスクリプトを実行して環境を変更することはできません。