0

環境変数を読み取り、それらの変更を適切に処理することになっているアプリケーションを C で作成しました。アプリケーションが起動したら、 を介して先に進み、変数を初期化するように設定しました (null ポインターが返されないようにするため) setenv("MYVARIABLE", "TEST", 1)

このアプリケーションは頻繁にループし、ループ中のジョブの 1 つは、 を介してそのグローバル変数をチェックすることですgetenv("MYVARIABLE")

そのときの計画は、シェル スクリプトまたは Python スクリプトのいずれかでこれらの環境変数を変更することでした。C アプリケーションは全画面表示であるため、別のターミナル エントリなしではこのプロセスをテストする方法がありません。他の端末 ( c2) で、次のようなコマンドを実行します。

MYVARIABLE="My New Value"

また

export MYVARIABLE="My New Value"

ただし、私のアプリケーションは環境の更新をキャッチしていないようです。代わりに、MYVARIABLE は「テスト」であり、「My New Value」ではないと主張し続けています。これら 2 つの環境が分離されている理由はわかりませんが、連携する必要があります。私が間違っていることを誰かが知っていますか?

私のシステムは、興味のある人のために Archlinux を実行しています

4

2 に答える 2

1

現在直面している問題は、変数をローカル シェル セッションのスコープにしか設定していないことです。元:

(bash を想定) 次のような変数を設定する場合:

MYVARIABLE="My New Value"

次のように設定すると、現在のシェルにのみ影響します。

export MYVARIABLE="My New Value"

現在のシェルと、現在のシェルから開始されたすべてのプロセスに影響します。

.bashrc ファイルに設定すると、将来のすべてのセッションで永続的に設定されますが、現在のセッションで機能するには、そのファイルをソースする必要があります。


最善の解決策は、プロセスをフォークすることです。たとえば、プログラムが呼び出された場合、a.out次を実行できます。

> ./a.out &

これにより、プログラムの実行中にシェル セッションで作業を続けることができ、同じセッションで変数を設定できます。


私がこれまでに見た唯一の他のオプションは、シェルセッションが入ってくるソースを強制的に「自動」にすることです。

1) 最初のセッションで次のように入力します。

trap 'source ~/.bashrc' DEBUG

2) 次に、同じセッションでプログラムを開始します。

./a.out

3) 2 番目のウィンドウでファイルを編集して.bashrc、新しい環境変数を追加します。

4) 2 番目のウィンドウで、新しいバージョンのファイルを取得します。

source ~/.bashrc

これで、プログラムを実行する最初のウィンドウで、新しい変数がそのセッションに設定されます。以前にそれを使用したことがあり、機能することはわかっていますが、すでに生成されているアプリケーションで試したことはありません..しかし、あなたにとっては機能するはずです。

于 2013-06-20T18:24:57.333 に答える
0

プロセス環境は動的に変更できません!!!

この main() プロトタイプを覚えておいてください...

int main (int argc, char *argv[], char *envp[])
{
    char *path;

    /*
    Searches in this process envp[] only,
    There is no way it can access changes happening in Shell command prompt...
    User shell does not communicate with this process, if not piped.
    This will always return PATH, that was set at the time of starting.
    */
    while (1)
    {
        path = getenv("PATH");
        sleep (5);
        printf("PATH = %s\n", path);
        free(path);
    };
}

getenv() ライブラリ関数に関するあなたの理解は間違っています。期待を達成するには、任意の形式の IPC を使用する必要があります。

setenv() は、呼び出しプロセス自身の環境で動作します。これは、fork()、exec() syscalls を介して独自の子プロセスに渡されます。これは、親プロセスであるシェルでは何もしません。

于 2013-06-21T00:33:28.857 に答える