【问题标题】:Why does argc exist/why does env NOT have simething similar?为什么 argc 存在/为什么 env 没有类似的东西?
【发布时间】:2019-11-23 00:59:03
【问题描述】:

我在这里阅读: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

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

【问题讨论】:

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


    【解决方案1】:

    我对早期 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 &lt; 3) usage(); 之类的内容将需要多行代码。

    所以拥有argc,这在技术上是不必要的,但很方便;而拥有envc 确实是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-17
      • 2020-09-07
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2022-11-24
      相关资源
      最近更新 更多