检查env是否为空

时间:2015-01-07 14:44:19

标签: c linux environment-variables development-environment

我正在为我的学校写一个程序。

我需要使用术语env但是如果校正器用env -i启动我的程序,我的程序会出现段错误。

启动程序时如何避免C中的空env?

由于

2 个答案:

答案 0 :(得分:0)

通常情况下::

#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&lt; - 这是您的用户名。

答案 1 :(得分:0)

您有多种方法可以访问环境:

  1. 作为main(int main(int argc, char **argv, char **envp);
  2. 的第三个参数
  3. 通过环境全局变量(char **environ;
  4. 通过 getenv(3)库函数。这只会在环境中搜索"VARNAME=value"形式的字符串。
  5. 环境始终存在,因为它通常通过来自父进程的exec(2)系统调用(在unix和MS-DOS / Windows系统中)作为一组nul(\ 0)传递给进程终止字符串,后跟一个nul(在最后一个字符串后面的另一个\ 0)所以环境的结尾可能是两个nul的顺序(这是它在msdos上传递的方式,在其他unices中你可以有另一种方法来执行此操作)。一个空的环境就是传递一个空的字符串数组(只是一个NULL指针来指示环境的结束)。

    尽管如此,main()接收(以及environ变量)也是一个char指向字符串的数组(通常通过基本的C运行时准备),然后是NULL指向信号端的指针,因此空的环境将类似于:

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

    如果你检查这个(if (environ[0] == NULL)),你会得到一个空的环境。请注意,必须明确调用正确的 exec(2)调用,才能包含一个空的环境字符串数组。这是一个非常罕见的情况,如果您尝试在空的环境中调用许多标准程序,可能会遇到麻烦。

    这同样适用于arg列表,在这种情况下,几乎所有unices遵循在argv [argc]中放置NULL的约定,你可以这样做,但要小心,因为你几乎总是有一个字符串(程序)姓名)所以

    env
    

    主要收到:

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

    env -i
    

    将在主要收到:

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

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

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

    我是在谈论内存,但我认为将NULL放在argv列表末尾的惯例是POSIX约定。欢迎提出意见。

相关问题