命令行参数如何工作?

时间:2012-02-21 10:37:31

标签: c command-line-arguments

正如问题所提到的,命令行参数如何在C中起作用(通常是任何语言)。我能想到的逻辑解释是,操作系统在启动时为流程设置某种环境值。 但是如果它是真的我不应该像argp [i]那样访问它们(我修改了main以期望第二个参数为char ** argp而不是** argv)。请解释一下。

3 个答案:

答案 0 :(得分:7)

我会尝试比其他答案更多地解释实施 我确信存在不准确之处,但希望它能够很好地描述相关部分。

在shell下输入./myprog a b c shell解析它,并指出你想用三个参数运行./myproj 它会调用fork来创建一个新流程,其中./myprog会运行 子进程仍然运行shell程序,它准备了一个包含5个字符指针的数组。第一个将指向字符串./prog,接下来的三个指向字符串abc,最后一个指向NULL。 接下来,它调用execve函数,以创建参数数组运行./myprog execve./myprog加载到内存中,而不是shell程序。它释放shell程序分配的所有内存,但确保保留参数数组 在新程序中,调用main,参数数组作为argv传递给它。

答案 1 :(得分:3)

在C程序中,OS会创建一个指向零终止字符串的指针数组。计数传递为argc,数组传递为argv。你已经知道了。名称argcargv无关紧要。您可以使用任何名称。数据类型和订单确实很重要...... argv必须是intargc必须是char*[]char**。其他语言也有类似的机制。例如,C#传递一个string[]参数,该参数是一个.NET数组,并在内部跟踪它的长度。有关详细信息,请访问:http://en.wikipedia.org/wiki/Main_function#C_and_C.2B.2B

环境变量名称与程序中变量的名称是分开的。 argcargv不是环境变量......它们是main()的本地变量。

要访问环境变量,请使用getenv()

更新:您想了解这些程序是如何提供的。操作系统就是这样做的。但是在操作系统可以执行此操作之前,调用可执行文件的程序(调用者)可以处理命令行。通常,调用者是shell(bashcshzshcmd.exe)或桌面环境,如GNOME或Windows资源管理器。调用者通过execve(在* nix上)或CreateProcess(在Windows上)传递这些参数。

答案 2 :(得分:1)

你给主要论点的名字是什么,重要的是它们的类型和顺序。要获得env vars,请使用此闭包:

int main(int argc, char ** myCommandLineArguments, char ** myEnvironmentVars)

这是你想知道的吗?