【问题标题】:Check if env is empty检查环境是否为空
【发布时间】:2015-01-07 14:44:19
【问题描述】:

我正在为我的学校编写程序。

我需要使用术语 env,但如果更正者使用 env -i 启动我的程序,我的程序段错误。

在启动我的程序时如何避免 C 中的空环境?

谢谢

【问题讨论】:

  • 通过检查getenv返回的指针不是NULL?并且不要为某些特定环境编写代码,除非您也有默认的回退。
  • 练习规则禁止使用getenv..
  • 类似于this 问题。请注意,循环遍历它们,字符串(在该示例中为 thisEnv)将包含 variable=somthing,如 TERM=vt100,因此您也必须对其进行标记。

标签: c linux environment-variables development-environment


【解决方案1】:

正常情况下::

#include <stdio.h>

main (int argc, char **argv, char **env)
{
    // Do Something.
    char *envHomepath;
    envHomepath = getenv("HOME");
    if (envHomepath == NULL)
        printf("HOME env is NULL\n");
    else
        printf("HOME env is %s\n", envHomepath); 

    return 0;
}

那么 它会输出到控制台

HOME env 是 /user/xxxxx.xxx

【讨论】:

    【解决方案2】:

    您有几种访问环境的方法:

    1. 作为 main 的第三个参数 (int main(int argc, char **argv, char **envp);)
    2. 通过环境全局变量 (char **environ;)
    3. 通过 getenv(3) 库函数。这只会在环境中搜索"VARNAME=value" 形式的字符串。

    环境始终存在,因为它通常通过父进程(在 unix 和 MS-DOS/Windows 系统中)的 exec(2) 系统调用作为一组以 nul (\0) 终止的字符串传递给进程, 后跟一个 nul(最后一个字符串后面的另一个 \0),因此环境的结尾可能是两个 nul 的顺序(这是它在 msdos 上传递的方式,在其他 unices 中,您可以有另一种方法来执行此操作)。空环境将传递一个空的字符串数组(只是一个 NULL 指针来表示环境的结束)。

    尽管如此,main() 接收(以及 environ 变量)是一个指向字符串的 char 指针数组(通常通过基本 C 运行时准备),然后是指向信号的 NULL 指针de end,所以一个空的环境会是这样的:

    char **environ = { NULL }; /* at least a NULL pointer to indicate the end of the environment */
    

    如果您检查这一点 (if (environ[0] == NULL)),您将得到一个空环境的指示。请注意,您必须显式调用正确的 exec(2) 调用以包含一个空的环境字符串数组才能发生这种情况。这是一种非常少见的情况,如果您尝试使用空环境调用许多标准程序,您可能会遇到麻烦。

    这同样适用于 arg 列表,在这种情况下,几乎所有的 unice 都遵循在 argv[argc] 处放置 NULL 的约定,你也可以这样做,但要注意你几乎总是有一个字符串(程序名字)所以

    env
    

    在 main 中收到:

    int argc = 1;
    char **argv = { "env", NULL };
    

    env -i
    

    将在 main 中收到:

    int argc = 2;
    char **argv = { "env", "-i", NULL };
    

    另外,有可能(在 unix 中,而不是在 ms-dos 中)传递一个空的 arg 列表。这是非常罕见的并且依赖于体系结构(Linux 使用它来询问共享可执行文件 --- 一个 .so 文件 --- 它有什么依赖项)所以很少会期望一个空的参数列表。

    例如,您可以通过检查if (argc == 0) 来检测它。

    我是凭记忆说的,但我认为将NULL 放在argv 列表末尾的约定是POSIX 约定。欢迎评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2010-12-23
      • 2013-07-18
      相关资源
      最近更新 更多