【问题标题】:Using setenv() in C在 C 中使用 setenv()
【发布时间】:2020-02-22 05:15:45
【问题描述】:

我想了解 setenv() 的工作原理。文档是

setenv (const char *name, const char *value, int overwrite)

我希望能够编辑环境变量数组。比如我想设置

envp[1] = "Hello World"

虽然我对 setenv 函数感到困惑,但不确定如何在该函数中实现。覆盖是否是环境数组的索引。这会影响像这样的所有环境的打印吗?

#include <stdio.h>

void main(int argc, char *argv[], char * envp[])
{
    int i;

    for (i = 0; envp[i] != NULL; i++)
    {    
        printf("\n%s", envp[i]);
    }
}

因此,与通常在 envp[1] 中的内容不同,它改为“Hello World”。我也不确定覆盖设置为 1 是否意味着 envp[1]。

【问题讨论】:

    标签: c linux operating-system environment-variables


    【解决方案1】:

    为什么要修改环境变量数组? envp 只是程序启动时环境变量的副本。

    首先,“Hello World”不是一个有效的环境变量。环境变量就像任何其他具有标识符(名称)和值的变量一样。可以有一个环境变量 STR=HelloWorld。

    如果你只是想设置上面的环境变量,你只需调用setenv("STR", "HelloWorld", 1)。覆盖标志 1 确保 STR 的先前值被此函数覆盖。如果覆盖标志为 0,setenv 不会更改已经设置的环境变量的值。

    这样会影响所有环境的打印吗?

    当我用 gcc 测试它时它不会改变值。原因是getenv()setenv()函数是成对使用来访问环境变量的。 c字符串数组envp就是程序启动时的环境变量数组。此外,envp 通常不会从 main 函数传递,这意味着其他函数不知道 envp

    【讨论】:

    • “Hello World”是环境变量的有效名称。它在 macOS 10.14.6 上的文档没有提到任何限制,只是它不能为空或包含 =。而setenv("Hello World", "foo") 返回 0,之后getenv("Hello World") 返回一个指向包含“foo”的字符串的指针。
    • @EricPostpischil:是的——但我发现(在 Ubuntu 18.04 上)setenv("hello world", "foo bar") 并调用另一个程序后,该程序在其环境中看不到该变量。我正在试图弄清楚发生了什么。
    • @KeithThompson 请注意,shell(例如 bash、ksh、zsh)只能使用名称为有效 var 名称的 env var。因此,虽然您可以定义一个名为“hello world”的环境变量,但您将无法在大多数 shell 中使用它。另外,当您说“调用另一个程序”时,如果您的意思不是调用 setenv() 的程序启动另一个程序,那么,是的,其他程序不会看到 var。
    • @KurtisRader:是的,我的意思是调用setenv() 的程序正在启动另一个程序。进一步的实验表明,在我的系统(Ubuntu 18.04)上,/bin/sh(指向/bin/dash 的符号链接)会在启动时删除名称中带有空格的环境变量。其他 shell(bashtcsh)不这样做。如果我使用system() 调用程序,它会通过/bin/sh,并清除Hello World 环境变量。如果我使用execv 直接调用其他内容,则不是(env | grep hello 在我使用的示例中显示hello world=foo)。
    • @EricPostpischil:见上面的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多