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

規格

標準/拡張機能 C/C++ 依存項目
POSIX.1a
Single UNIX Specification、バージョン 3

Language Environment®
both  

Format

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 つの名前があります。 一方の名前には 2 つの下線文字が接頭部として付き、もう一方の名前にはこの接頭部がありません。 接頭部が下線文字のない名前は、 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. The value of the 変更フラグ is irrelevant if 新規値=ヌル.
  2. '_BPXK_' で始まる環境変数は、 z/OS® UNIX サービスによって定義された変数名と競合する可能性があるため、定義してはなりません。 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

関連情報