正如问题所述,命令行参数如何在C中工作(通常是任何语言)。我能想到的逻辑解释是,操作系统在启动时为流程设置了某种环境价值。 但是,如果这是真的,我不应该能够访问他们作为argp [我]等(我修改主要期望第二个参数为char ** argp而不是** argv)。请解释。命令行参数如何工作?
回答
我会尽力解释一下比其他答案更多的实现。
我确定有不准确的地方,但希望它能够很好地描述相关部分。
在shell下,键入./myprog a b c
。
Shell解析它,并计算出你想用三个参数运行./myproj
。
它调用fork
,创建一个新进程,其中./myprog
将运行。
仍然运行shell程序的子进程准备一个由5个字符指针组成的数组。第一个将指向字符串./prog
,接下来的三个是字符串a
,b
和c
,最后一个被设置为NULL。
接下来,它调用execve
函数,运行./myprog
并创建参数数组。
execve
将./myprog
加载到内存中,而不是shell程序。它释放由shell程序分配的所有内存,但确保保留参数数组。
在新程序中,调用main
,并将参数数组传递给它作为argv
。
为什么'execve'不需要'argc'参数? – 2012-02-21 11:25:38
实际上,该数组将包含五个条目,不要忘记第一个(第零)位置中的程序名称。 – 2012-02-21 11:29:53
它可能会使用fork-exec之外的其他机制来实际创建新进程。这完全取决于操作系统,对于这个问题目的无关紧要。无论OS和shell使用哪种机制来运行命令,都必须包含传递命令行参数。这是类UNIX的方式,其中参数被“fork”和“存活”execve“克隆”。 – 2012-02-21 11:50:48
你对主要参数有什么名字,重要的是它们的类型和顺序。要获得环境变量使用此关闭:
int main(int argc, char ** myCommandLineArguments, char ** myEnvironmentVars)
这是你在想什么?
感谢您的回答。其实,我的问题不是关于如何访问它们,而是关于谁和如何使它们可用于该程序。 – Thunderman 2012-02-21 10:47:32
在C程序中,操作系统创建一个指向零终止字符串的指针数组。计数通过为argc
,数组通过为argv
。你已经知道这一点。名称argc
和argv
无关紧要。你可以使用任何名字。数据类型和顺序很重要... argv
必须是int
和argc
必须是char*[]
或char**
。其他语言有类似的机制。例如,C#传递了一个参数,它是一个.NET数组,并在内部持续跟踪其长度。有关详细信息,请访问:http://en.wikipedia.org/wiki/Main_function#C_and_C.2B.2B
环境变量名称与程序中的变量名称是分开的。 argc
和argv
不是环境变量......它们是main()
的本地变量。
要访问环境变量,请使用getenv()
。
更新:您想知道如何将这些提供给程序。这是做到这一点的操作系统。但在操作系统可以这样做之前,调用可执行文件的程序(调用者)可以处理您的命令行。通常,调用者是一个shell(bash
,csh
,zsh
,cmd.exe
)或桌面环境(如GNOME或Windows资源管理器)。调用者通过execve(on * nix)或CreateProcess(在Windows上)传递这些参数。
- 1. 如何从命令行传递给SLURM作业的命令行参数?
- 2. 命令行参数
- 3. 命令行参数
- 4. 命令行参数
- 5. 命令行参数
- 6. 命令行参数
- 7. 命令行参数
- 8. 命令行参数?
- 9. 按钮命令参数不工作
- 10. 如何处理命令行参数缺少的命令行参数/选项?
- 11. 命令行参数和命令行参数数组的长度
- 12. 命令行解释器如何工作?
- 13. 如何让Dotfuscator从命令行工作?
- 14. QT:UIC命令行工具和-tr参数
- 15. Epicor 10 DMT工具命令行参数
- 16. 将字符串作为命令行参数传递时,转义如何工作?
- 17. 如何解析命令行参数?
- 18. 如何隐藏命令行参数
- 19. 如何捕获CMake命令行参数?
- 20. 如何使用命令行参数
- 21. TASM如何获得命令行参数?
- 22. 如何使用参数执行命令?
- 23. 如何访问命令行参数?
- 24. 如何unittest命令行参数?
- 25. 如何给命令行参数gnuplot
- 26. 如何依赖于命令行参数
- 27. 如何获得命令行参数“和”
- 28. 如何获得Mono命令行参数?
- 29. 如何通过命令行参数sidekiq
- 30. 如何访问Windows命令行参数?
为什么你认为你不应该可以像argp [i]那样访问它们? (请注意,函数参数名在编译的程序中通常没有意义,将main参数命名为'argv'只是一个惯例,如果需要,可以命名为'FOOBAR') – nos 2012-02-21 10:42:46
参数'main'只是就像任何其他功能的参数一样。名称并不重要,只要类型匹配,您甚至可以在函数原型和实际函数中使用不同的参数名称。在'main'的参数来源并不重要的地方,只要将它们当作任何整数和指针数组(或者指针指向你的情况)即可。 – 2012-02-21 10:53:49