【发布时间】:2015-01-07 14:44:19
【问题描述】:
我正在为我的学校编写程序。
我需要使用术语 env,但如果更正者使用 env -i 启动我的程序,我的程序段错误。
在启动我的程序时如何避免 C 中的空环境?
谢谢
【问题讨论】:
标签: c linux environment-variables development-environment
我正在为我的学校编写程序。
我需要使用术语 env,但如果更正者使用 env -i 启动我的程序,我的程序段错误。
在启动我的程序时如何避免 C 中的空环境?
谢谢
【问题讨论】:
标签: c linux environment-variables development-environment
正常情况下::
#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
【讨论】:
您有几种访问环境的方法:
int main(int argc, char **argv, char **envp);)char **environ;)"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 约定。欢迎评论。
【讨论】: