为什么argc存在/为什么env没有类似的东西?

时间:2019-07-13 16:18:10

标签: unix environment-variables command-line-arguments

我在这里阅读:http://asm.sourceforge.net/articles/startup.html#st

显然,ELF二进制文件的堆栈布局如下:

argc          Number of arguments, which is the size of argv  
argv[0]       Program name
------------
argv[1]       Arguments that get passed to the program
...
argv[argc-1]
------------
NULL
------------
env[0]       Environmental variables
...
env[n]
-----------
NULL

这里有两件事要注意,我认为它们有些不一致。

  1. argv和env均为NULL终止。
  2. 只有argv具有单独的大小变量。

由于它们都是NULL终止的,因此严格来说argc并不是必须的,即使它可以使某些事情变得容易一些。这样,您不必遍历整个数组即可找到大小。但是这些好处也适用于env

这里的理由是什么?他们为什么选择不同的方法?

1 个答案:

答案 0 :(得分:2)

我对早期Unix设计师的思想没有特别的见识。但是一方面,在很多情况下您想知道命令行参数的数量,例如if (argc < 3) usage();。但是我无法想到您实际上关心环境中设置了多少变量的任何情况。可以理解,用户可能设置了与您的程序无关的任意数量的环境变量,并且您的程序应该忽略它们。因此,环境数组中是否有5或500个条目不是您的程序应该关心的;您应该只查找已记录在案的对程序有影响的文件。

这样,拥有envc变量的唯一原因就是要做类似的事情

int i;
for (i = 0; i < envc; i++) {
    if (strncmp(env[i], "FROB=", strlen("FROB=")) == 0) {
        frob();
    }
}

但这就像

一样容易编写
char **p;
for (p = env; *p; p++) {
    if (strncmp(*p, "FROB=", strlen("FROB=")) == 0) {
        frob();
    }
}

另一方面,如果未提供argc,则类似if (argc < 3) usage();的代码将需要多行代码。

因此,从技术上讲,不需要argc很方便;而拥有envc确实是多余的。