setenv() - 環境変数の追加、削除および変更

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1a
Single UNIX Specification、バージョン 3
Language Environment

両方  

形式

POSIX - C のみ:
#define _POSIX1_SOURCE 2
#include <env.h>

int setenv(const char *var_name, const char *new_value, int change_flag)
Single UNIX Specification、バージョン 3:
#define _UNIX03_SOURCE
#include <stdlib.h>

int setenv(const char *var_name, const char *new_value, int change_flag)
非 POSIX:
#include <stdlib.h>

int setenv(const char *var_name, const char *new_value, int change_flag)

機能説明

環境変数を追加、変更、および削除します。

ユーザーのネーム・スペースでの違反を回避するために、この関数の POSIX 以外のバージョンには、2 つの名前があります。1 つの名前の接頭部には 2 つの下線文字が付き、もう 1 つの名前の接頭部には付きません。接頭部下線文字が付いていない名前は、LANGLVL(EXTENDED) を使用する場合にのみ表示されます。

この関数を使用するには、その外部エントリー・ポイント名 (2 つの下線文字で始まる名前) を使用して呼び出すか、LANGLVL(EXTENDED) を使用してコンパイルする必要があります。LANGLVL(EXTENDED) を使用すると、ヘッダー内の関連情報も表示されます。

var_name は、追加、変更、または削除を行う環境変数の名前を含む 文字ストリングへのポインターです。setenv() を呼び出すときに、var_name に等号 ('=') が含まれていると、setenv() は失敗し、errno には無効な引数が関数に渡されたことを示す値が設定されます。

new_value は、var_name で指定された環境変数の 値を含む文字ストリングへのポインターです。new_value が NULL ポインターの場合には、var_name で指定された環境変数のオカレンスすべての削除を指示しています。

change_flag は、次の整数値のいずれかをとることができるフラグです。
ゼロ以外の値
既存のエントリーを変更します。var_name が既に定義済みで、環境変数テーブルに存在している場合 には、その値は new_value更新されることになりますvar_name が以前は未定義だった場合には、テーブルに付加されます。
0
既存のエントリーを変更しません。

var_name が既に定義済みで、環境変数テーブルに存在している 場合には、その値は new_value更新されません。ただし、var_name が以前は未定義だった場合には、テーブルに 付加されます。

注 :
  1. new_value=NULL の場合には、change_flag の 値は不適切です。
  2. z/OS®UNIX サービスで定義されている変数名と対立する可能性があるので、「_BPXK_」で始まる環境変数を定義しないでください。setenv() は、BPX1ENV 呼び出し可能サービスを使用して、 「_BPXK_」で始まる環境変数をカーネルに渡します。

    また、「_EDC_」および「_CEE_」も使用しないでください。これらは、ランタイム・ ライブラリーおよび Language Environment® によって使用されます。

setenv() 関数によって設定されている環境変数は、プログラムの存続時間だけ存在します。プログラム終了処理の前には保管されません。環境変数のその他の設定方法は、「z/OS XL C/C++ プログラミング・ガイド」の『環境変数の使用』を参照してください。

POSIX C の特殊な動作: POSIX では、次のいずれかが該当すると setenv() を使用することができます。
  • コードがコンパイラー・オプション LANGLV(ANSI) を指定してコンパイルされ、#include <env.h> を使用しており、POSIX 機能テストをオンにしている。
  • コードが LONGNAME を指定してコンパイルされ、OMVS オプションを指定して事前リンクされている。

戻り値

正常に実行された場合、setenv() は 0 を戻します。

正常に実行されなかった場合、setenv() は、-1 を戻し、発生した障害のタイプを示すように errno を設定します。

エラー・コード
説明
EINVAL

name 引数が NULL ポインターであるか、空ストリングを指しているか、または「=」文字を含むストリングを指しています。

注: z/OS V1.9 以降、環境変数 _EDC_SUSV3 は、 var_name が NULL ポインター、空ストリングを指している、または「=」文字を含むストリングを指している時の EINVAL を 設定することに関する、setenv() の動作を制御するために使用できます。デフォルトでは、setenv() はこれらの条件で EINVAL を設定しません。 _EDC_SUSV3 が 1 に設定された場合、以下の条件のいずれかが「真」の場合に、setenv() は errno を EINVAL に設定します。
ENOMEM
変数またはその値を環境に追加するために使用可能なメモリーが不足しています。

CELEBS03
⁄* CELEBS03                                      

   This example (program 1) sets the environment variable                       
   _EDC_ANSI_OPEN_DEFAULT.                                                      
   A child program (program 2) is then initiated via a system                   
   call.                                                                        
   The example illustrates that environment variables are                       
   propagated forward to a child program, but not backward to                   
   the parent.                                                                  
                                                                                
 *⁄                                                                             
#include <stdio.h>                                                              
#include <stdlib.h>                                                             
                                                                                
int main(void)                                                                  
{                                                                               
   char *x;                                                                     
                                                                                
   ⁄* set environment variable _EDC_ANSI_OPEN_DEFAULT to "Y" *⁄                 
   setenv("_EDC_ANSI_OPEN_DEFAULT","Y",1);                                      
                                                                                
   ⁄* set x to the current value of the _EDC_ANSI_OPEN_DEFAULT*⁄                
   x = getenv("_EDC_ANSI_OPEN_DEFAULT");                                        
                                                                                
   printf("program1 _EDC_ANSI_OPEN_DEFAULT = %s¥n",                             
      (x != NULL) ? x : "undefined");                                           
                                                                                
   ⁄* call the child program *⁄                                                 
   system("program2");                                                          
                                                                                
   ⁄* set x to the current value of the _EDC_ANSI_OPEN_DEFAULT*⁄                
   x = getenv("_EDC_ANSI_OPEN_DEFAULT");                                        
                                                                                
   printf("program1 _EDC_ANSI_OPEN_DEFAULT = %s¥n",                             
      (x != NULL) ? x : "undefined");                                           
}                                                                               
CELEBS04
⁄* CELEBS04                                      

   Program 2:                                                                   
   A child program of CELEBS03, which is initiated via a system call.           

 *⁄                                                                             
#include <stdio.h>                                                              
#include <stdlib.h>                                                             
                                                                                
int main(void)                                                                  
{                                                                               
   char *x;                                                                     
                                                                                
   ⁄* set x to the current value of the _EDC_ANSI_OPEN_DEFAULT*⁄                
   x = getenv("_EDC_ANSI_OPEN_DEFAULT");                                        
                                                                                
   printf("program2 _EDC_ANSI_OPEN_DEFAULT = %s¥n",                             
      (x != NULL) ? x : "undefined");                                           
                                                                                
   ⁄* clear the Environment Variables Table *⁄                                  
   setenv("_EDC_ANSI_OPEN_DEFAULT", NULL, 1);                                   
                                                                                
   ⁄* set x to the current value of the _EDC_ANSI_OPEN_DEFAULT*⁄                
   x = getenv("_EDC_ANSI_OPEN_DEFAULT");                                        
                                                                                
   printf("program2 _EDC_ANSI_OPEN_DEFAULT = %s¥n",                             
      (x != NULL) ? x : "undefined");                                           
}                                                                               
出力:
program1 _EDC_ANSI_OPEN_DEFAULT = Y
program2 _EDC_ANSI_OPEN_DEFAULT = Y
program2 _EDC_ANSI_OPEN_DEFAULT = undefined
program1 _EDC_ANSI_OPEN_DEFAULT = Y

関連情報