asp*_*100 5 c++ program-entry-point environment-variables
我已经明白这char **envp是第三个参数main,并且在下面的代码的帮助下,我能够看到它实际包含的内容.
int main(int argc, char *argv[], char *env[])
{
int i;
for (i=0 ; env[i] ; i++)
std::cout << env[i] << std::endl;
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么(在什么情况下)程序员需要使用它?我发现了很多解释什么这个说法呢,但没有什么能告诉我在那里,这是通常使用的.试图了解这可能会使用哪种现实世界的情况.
它是一个包含所有环境变量的数组.例如,它可用于获取当前登录用户的用户名或主目录.例如,一种情况是,如果我想在用户的主目录中保存配置文件,我需要获取PATH;
int main(int argc, char* argv[], char* env[]){
std::cout << env[11] << '\n'; //this prints home directory of current user(11th for me was the home directory)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
等效env是字符*的getenv(为const char*名称)功能,该功能更容易使用,例如:
std::cout << getenv("USER");
Run Code Online (Sandbox Code Playgroud)
打印当前用户的用户名.
该getenv()
函数允许您查找特定环境变量的值,但不提供扫描整个环境变量列表的机制。该envp参数允许您遍历整个环境变量列表,如您的演示代码所示,使用getenv()接口根本不可行。
在POSIX系统上,有一个全局变量extern char **environ;,它也指向环境。这些功能putenv()(较旧,不受欢迎,因为它存在内存管理问题),setenv()并且unsetenv()还可以操纵环境变量列表(由定义environ)。程序可以直接修改environ或其指向的值,但这是不可取的。
如果您使用fork()的exec*()是函数系列,除非您execve()明确使用和指定环境,否则子进程将接收定义的环境environ。
没有头声明environ— AFAIK,这是POSIX定义的唯一没有头声明的变量。C标准将int main(int argc, char **argv, char **envp)签名识别为对main()附件J中记录的标准的通用扩展。
| 归档时间: |
|
| 查看次数: |
4267 次 |
| 最近记录: |