ファイヤープロジェクト
環境変数
2003-07-20T15:13+09:00   matsu
HOMEやUSERなど,環境変数に応じた処理をしたくなることもあろう.なので,環境変数を取得したり設定したりできると嬉しい.
環境変数の取得と設定にはgetenvとputenvを使用する.以下例.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

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

  int opt;
  int result;
  char **parameter;
  char *variable;
  char *string;

  /* -gと-sの二種類のオプションを取る */
  opt=getopt(argc,argv,"gs");
  switch(opt){
    /* -gは続く引数に環境変数を指定して,その値を出力する. */
  case 'g':
    for(;optind<argc;optind++){
      fprintf(stdout,"%s = %s\n",argv[optind],getenv(argv[optind]));
    }
    break;

    /* -sは続く引数(variable=valueの形式)で環境変数を設定する. */
  case 's':
    for(;optind<argc;optind++){
      /* 環境変数を設定 */
      if(putenv(argv[optind])!=0){
	fprintf(stderr,"input : %s\n",argv[optind]);
	fprintf(stderr,"format: variable=value\n");
	exit(1);
      }

      *parameter=argv[optind];
      /* 引数の左辺を取り出す */
      variable=strsep(parameter,"=");
      /* 設定した環境変数を出力 */
      fprintf(stdout,"%s = %s\n",variable,getenv(variable));
    }
    break;

  case '?':
    fprintf(stderr,"Usage :\n");
    fprintf(stderr,"\t-s set environment\n");
    fprintf(stderr,"\t-g get environment\n");
    exit(1);
  }

  exit(0);

}
これを実行すると,以下のようになる.
$> ./environ -g HOME USER HOGE  
HOME = /home/matsu
USER = username
HOGE = (null)

$> ./environ -s HOGE=HOGE FUGA=FUGA
HOGE = (null)
FUGA = (null)
putenvを使う方(-s)の方がなんだか失敗している.原因は不明.
プログラム中で環境変数を変更しても,コマンドプロンプトに戻ったらその変更は反映されない.つまり子プロセスの変更は親プロセスには反映されない.具体例を以下に示す.
#include <stdio.h>

int main(int argc,char *argv[])
{
  fprintf(stdout,"HOGE=%s\n",getenv("HOGE"));
  putenv("HOGE=hoge");
  fprintf(stdout,"HOGE=%s\n",getenv("HOGE"));

  exit(0);

}
これを実行してechoとかしてみる.
> ./environ2
HOGE=(null)
HOGE=hoge

$> echo $HOGE

と,上のプログラムを実行してputenv("HOGE=hoge")しても親プロセスであるshellにもどってecho $HOGEしても$HOGEが設定されていないことになっている.
matsu(C)
Since 2002
Mail to matsu