2013-07-29 18 views
14

我需要導出幾個變量,使得他們看起來像在命令行中如何使用setenv()在C++中導出變量?

export ROS_HOSTNAME=xxx 

如何使用在C SETENV()以下++實現的呢?

謝謝。

+0

爲什麼你在問題的上下文中提到了[tag:command-line]標籤?你需要'出口'_在哪裏?請詳細說明一下! –

+1

在什麼情況下,這些環境變量需要可見?如果他們只需要在調用'setenv'的程序中可見,就沒關係。如果你需要它們在運行程序後在你的shell中可見*請說出來;有(間接的)方法可以做到這一點,但除非你提出這個問題,否則我不會回答這個問題。 –

+0

「導出」是* shell功能*。 'setenv()'總是「導出」'environ' /'envp',除非分叉的孩子通過自定義的'envp',即'execle()'。 – Barry

回答

21

setenv()手動輸入:

概要

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

說明
的SETENV()函數將更新或在調用進程的環境中添加的變量。 envname參數指向一個字符串,其中包含一個環境變量的名稱 被添加或更改。環境變量應設置爲envval指向的值。如果envname指向包含'='字符的字符串,該函數將失敗。如果 由envname命名的環境變量已經存在,並且覆蓋的值爲非零,則函數應返回成功並更新環境。如果由envname命名的環境變量 已經存在,並且覆蓋值爲零,則函數將返回成功,環境保持不變。

如果應用程序修改了environ或它指向的指針,setenv()的行爲是未定義的。 setenv()函數將更新指向environ 指向的列表。

由envname和envval描述的字符串被該函數複製。

setenv()函數不需要是可重入的。不需要重入的函數不需要是線程安全的。

返回值
成功完成後,返回零。否則,返回-1,錯誤設置爲錯誤,環境不變。

所以,你應該叫

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

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

爲你的情況。取決於,如果你想覆蓋一個可能存在的定義。

注:

不能使用setenv()從你的過程導出變量調用進程(殼)! 使用fork創建的子進程將繼承當前進程環境定義,因此也會繼承您的更改和添加。

0

此處可用於SETENV函數簽名

#include <stdlib.h> 

INT SETENV(常量字符* ENVNAME,常量字符* envval,INT改寫);

鏈接:http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html

你的情況,你怎麼稱呼它是這樣的:

setenv("ROS_HOSTNAME", "xxx", true); 

最後一個boolean參數表明,如果要覆蓋環境變量的值,如果它已經存在。

0

做這樣

setenv("ROS_HOSTNAME", "xxx", true); 

注意它的簡介,以及:

#include <stdlib.h> 

int setenv(const char *envname, const char *envval, int overwrite); 

this link,詳細瞭解setenv()