正如问题所提到的,如何在C(通常是任何语言)中使用命令行参数。我能想到的逻辑解释是,操作系统在启动进程时为其设置某种环境值。
但如果这是真的,我就不应该能够像argp[i]等方式访问它们(我修改了main函数,以便期望第二个参数为char ** argp而不是** argv)。请解释一下。
正如问题所提到的,如何在C(通常是任何语言)中使用命令行参数。我能想到的逻辑解释是,操作系统在启动进程时为其设置某种环境值。
但如果这是真的,我就不应该能够像argp[i]等方式访问它们(我修改了main函数,以便期望第二个参数为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
参数? - Agnel Kurianfork
“克隆”并由execve
“保留”。 - Steve Jessopmain
时正确的数组显示出来”,这并没有说明任何问题;-) - Steve Jessopargc
传递,数组作为argv
传递。您已经知道这一点。名称argc
和argv
并不重要。您可以使用任何名称。数据类型和顺序很重要... argv
必须是 int
, argc
必须是 char * []
或 char **
。其他语言也有类似的机制。例如,C#传递单个 string []
参数,它是.NET数组,并在内部跟踪其长度。有关更多信息,请参见此处。 argc
和 argv
不是环境变量...它们是本地变量 main()
。 getenv()
。
更新:您想知道如何将其提供给程序。这是操作系统所做的。但是,在操作系统能够这样做之前,调用可执行文件的程序(调用方)会处理您的命令行。通常,调用方是一个shell( bash
, csh
, zsh
, cmd.exe
)或桌面环境,例如GNOME或Windows Explorer。调用方通过execve(在*nix上)或CreateProcess(在Windows上)传递这些参数。int main(int argc, char ** myCommandLineArguments, char ** myEnvironmentVars)
这是你想知道的吗?
main
函数的参数与其他函数的参数一样。名称并不重要,即使在函数原型和实际函数中使用不同的参数名称,只要类型匹配即可。main
函数的参数来源并不重要,只需将它们视为整数和指针数组(或在您的情况下是指向指针的指针)即可。 - Some programmer dude