0

端末から C++ アプリケーションを実行し、特定の条件でコマンドを呼び出し元の端末に戻すことはできますか? たとえば、端末内で選択した後にアプリケーションを実行するとします。次のようなエクスポート コマンドを実行して、アプリケーションで PATH を変更する必要があります。

(BASH を使用)

export PATH=.:/home/User/application/bin:$PATH

完了後、アプリケーションが完全に閉じる前に、上記のコマンドを使用してアプリケーションで端末のローカル環境変数を変更できますか? Qtはこれを行う方法を提供していますか? 助けてくれてありがとう!

4

2 に答える 2

1

いいえ、親アプリケーション環境を変更することはできません。

なんで?親アプリが(おそらくを使用してsystem())起動したとき、実際にはfork()ed-子プロセスは親のほぼ正確なレプリカとして生まれ、次にその子はexecve()呼び出しを使用し、そのプロセスの実行可能イメージをアプリケーションの実行可能イメージに完全に置き換えました(スクリプトの場合は、bashのようなインタプリタのイメージになります)。

それに加えて、そのプロセスはさらにいくつかのものを準備しました。1つは、ファイルハンドル0、1、2(stdin、stdout、stderr)で始まる開いているファイルのリストです。また、環境変数(キー=値のペアとして)を含むメモリブロック(子プロセスのアドレス空間に属する)を作成しました。

環境ブロックはプロセスに属しているため、必要に応じて独自の環境を変更できます。ただし、プロセスが親の環境メモリブロック(またはその他のプロセス)を変更することはできません。これを実現する唯一の方法は、IPC(プロセス間通信)を使用して、親にその内部でこのタスクを実行するように優しく依頼することですが、親は(ローカルまたはネットワークソケットで)積極的にリッスンしており、そのような要求を喜んで実行する必要があります誰かから、そして子供はその点で他のプロセスと比較して特別なものではありません。

これは、シェルスクリプトを使用してbashの環境を変更できる理由でもありますが、外部プロセスを開始せずにbash自体によって処理されるため、sourceまたはbashマクロのみを使用します。.

ただし、上記の理由により、他のプログラムやスクリプトを実行して環境を変更することはできません。

于 2012-11-15T05:44:50.387 に答える
1

一般的な解決策は、アプリケーションで結果を標準出力に出力し、呼び出し元がその結果をその環境に渡すようにすることです。教科書的な例はssh-agent、環境変数の割り当てを出力するものです。あなたは通常それを呼び出すeval $(ssh-agent)

于 2012-11-15T06:04:15.500 に答える