unix - 为什么 argc 存在/为什么 env 没有类似的东西?
问题描述
我在这里阅读: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
这里有两点需要注意,我认为它们有点不一致。
- argv 和 env 都以 NULL 结尾。
- 只有 argv 有一个单独的大小变量。
由于它们是 NULL 终止argc
的,严格来说没有必要,即使它可以使一些事情变得更容易。就像这样,您不必遍历整个数组即可找到大小。但这些好处也适用env
。
这里的理由是什么?他们为什么选择不同的方法?
解决方案
我对早期 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
确实是多余的。
推荐阅读
- jenkins - 詹金斯管道s3文件下载
- php - 如何在 laravel 中的 Controller 中绑定角色中间件
- git - git hooks - 获取 git commit id
- angular - Angular 6 build --prod - /dist 7x 大小的 /src。听起来对吗?
- html - 是否有执行此布局的 2d for 循环?像捷径一样
- eloquent - 如何从 laravel 中删除模型的所有关联关系模型记录?
- python - 使用正则表达式验证章节标题
- python - 阻止 Matplotlib Jupyter 笔记本显示带有动画的情节
- runtime-error - 我在为 genymotion 启动 virtualbox 时出错
- android - 协调器布局中的 Fab 不隐藏