1. ホーム
  2. c++

[解決済み] c++で変数をエクスポートするには、setenv()を使用するにはどうすればよいですか?

2022-02-08 10:32:43

質問内容

いくつかの変数をエクスポートして、コマンドラインで次のように表示させる必要があります。

export ROS_HOSTNAME=xxx

c++でsetenv()を使って実現するにはどうしたらいいですか?

ありがとうございます。

解決方法は?

からの setenv() のマニュアル記載。

シノプシス

#include <stdlib.h>  
int setenv(const char *envname, const char *envval, int overwrite);

説明
setenv()関数は、呼び出し元プロセスの環境変数を更新または追加するものである。envname 引数は、更新する環境変数の名前を含む文字列を指す。 追加または変更される。環境変数には envval が指す値が設定される。envname が '=' 文字を含む文字列を指している場合、この関数は失敗する。また envname で指定された環境変数が既に存在し、かつ overwrite の値が 0 以外であれば、この関数は成功を返し、環境は更新される。環境変数 envname で指定された変数が既に存在し、overwrite の値が 0 である場合、この関数は成功を返し、環境は変更されないものとする。

アプリケーションが environ やそのポインタを変更した場合の setenv()の動作は未定義である。setenv()関数は、environが指すポインタのリストを更新しなければならない。 を指している。

envnameとenvvalで記述された文字列は、この関数によってコピーされます。

setenv()関数はリエントラントである必要はありません。リエントラントである必要がない関数は、スレッドセーフである必要はありません。

戻り値
正常に終了した場合は、0が返される。それ以外の場合は、-1 が返され、エラーを示す errno が設定され、環境は変更されないものとする。

だから、あなたは

setenv("ROS_HOSTNAME","xxx",1); // does overwrite

または

setenv("ROS_HOSTNAME","xxx",0); // does not overwrite

をご覧ください。既存の定義を上書きするかどうかによります。

注意

を使用することはできません。 setenv() を使って、自分のプロセスから呼び出し元のプロセス(シェル)に変数をエクスポートすることができます! fork で作成された子プロセスは、現在のプロセスの環境定義を引き継ぐので、あなたの変更と追加も同様に行われます。