7

char **envpが の 3 番目の引数であることを理解するようにmainなり、以下のコードの助けを借りて、実際に何が含まれているかを確認できました。

int main(int argc, char *argv[], char *env[])
{
  int i;
  for (i=0 ; env[i] ; i++)
    std::cout << env[i] << std::endl;
  std::cout << std::endl;
}

私の質問は、なぜ (どのような状況で) プログラマーがこれを使用する必要があるのでしょうか? この引数が何をするかについて多くの説明を見つけましたが、これが通常どこで使用されるかを教えてくれるものは何もありません. これが実際にどのような状況で使用されるかを理解しようとしています。

4

4 に答える 4

9

これは、すべての環境変数を含む配列です。たとえば、現在ログインしているユーザーのユーザー名またはホーム ディレクトリを取得するために使用できます。たとえば、構成ファイルをユーザーのホーム ディレクトリに保持したい場合に、PATH を取得する必要がある場合があります。

int main(int argc, char* argv[], char* env[]){

std::cout << env[11] << '\n';  //this prints home directory of current user(11th for me was the home directory)

return 0;
}

より使いやすいenvis char* getenv (const char* name)関数と同等です。たとえば、次のようになります。

 std::cout << getenv("USER");

現在のユーザーのユーザー名を出力します。

于 2013-10-05T14:53:17.323 に答える
8

このgetenv() 関数を使用すると、特定の環境変数の値を見つけることができますが、環境変数のリスト全体をスキャンするメカニズムは提供されません。このenvp引数を使用すると、環境変数のリスト全体を反復処理できます。これは、デモンストレーション コードが示しているように、getenv()インターフェイスを使用して実行できないことを示しています。

extern char **environ;POSIX システムには、環境を指すグローバル変数 があります。関数putenv()(古く、メモリ管理の問題が発生するため非推奨) でsetenv()ありunsetenv()、環境変数リスト ( で定義environ) を操作することもできます。environプログラムは、またはそれが指す値を直接変更できますが、それはお勧めできません。

fork()およびexec*()関数ファミリを使用している場合execve()、環境を明示的に使用および指定しない限り、子プロセスは によって定義された環境を受け取りますenviron

ヘッダーは宣言しませんenviron— 私の知る限り、宣言するヘッダーなしで POSIX によって定義された唯一の変数です。C 規格は、付録 J で文書化されている規格への共通の拡張機能としてint main(int argc, char **argv, char **envp)署名を認識しています。main()

于 2013-10-05T15:19:47.907 に答える
2

これは通常、プログラムのグループ全体の構成オプションやその他の情報を設定するために使用されます。もう 1 つの用途は、特定のマシンまたはユーザー設定の環境設定を指定することです。
よく知られている例は、PATH実行可能ファイルのルックアップ パスを含むLD_LIBRARY_PATH変数、または共有ライブラリをルックアップするパスを含む変数です。

于 2013-10-05T14:54:52.750 に答える
1

env環境変数にアクセスできます。文字列の配列が含まれています。例としては、ユーザーのホーム ディレクトリ、構成された言語スキーム、PATH 変数(直接実行可能なプログラムを探す場所は?) などがあります。

個々の環境変数を設定することもできます。たとえば、テスト (学習) と、アプリケーションをデプロイする本番システムがあるとします。一方のシステムでは変数「MY_APP_MODE=TEST」を設定し、もう一方のシステムでは「MY_APP_MODE=PROD」を指定できます。したがって、テスト システムと本番システムに異なるアプリケーションをデプロイする必要はありません。アプリケーションは、どの環境で実行されるかを判断できます。

于 2013-10-05T14:56:12.267 に答える