3

以下のメソッドがあり、ret 値を正しく 0 に設定します (setenv での成功を示します) が、この環境変数が実際に設定されているかどうかを確認すると、存在しません。なぜこれが起こるのでしょうか?

 void Class::mysetenv(char* a, char* b)                           
     {   
         if(a==0 || b==0)
             return;

         int ret = setenv(strdup(a), strdup(b), 1);
         printf("ret: %d %s %s\n", ret, a, b);                          
     }
4

1 に答える 1

12

関数がリークします。のマンページにsetenvは次のように書かれています:

この関数は、名前と値が指す文字列のコピーを作成します

したがって、それらを渡す前に自分でコピーする必要はありません。

シェル内からこのようにプログラムを実行しますか?

./a.out FOO 42

すると、実行されたプロセス ( ) に環境変数が設定され、a.outそれによって起動されたプロセスに継承されます。ただし、実行したシェルに「バブルアップ」することはありませんa.outsetこれが、やなどのコマンドexportが実際のプログラムではなくシェルの組み込みである理由でもあります。bash で「help export」をチェックアウトします。

于 2009-03-19T14:47:00.550 に答える