C 命令行参数是如何工作的?
正如问题所提到的,命令行参数在C语言(通常是任何语言)中是如何工作的。我能想到的逻辑解释是,操作系统在进程启动时为进程设置了某种环境值。C 命令行参数是如何工作的?,c,command-line-arguments,C,Command Line Arguments,正如问题所提到的,命令行参数在C语言(通常是任何语言)中是如何工作的。我能想到的逻辑解释是,操作系统在进程启动时为进程设置了某种环境值。 但是如果这是真的,我就不能以argp[I]等方式访问它们(我修改了main,希望第二个参数为char**argp,而不是**argv)。请解释。无论您给主要参数起什么名字,重要的是它们的类型和顺序。要获取环境变量,请使用此闭包: int main(int argc, char ** myCommandLineArguments, char ** myEnvir
但是如果这是真的,我就不能以argp[I]等方式访问它们(我修改了main,希望第二个参数为char**argp,而不是**argv)。请解释。无论您给主要参数起什么名字,重要的是它们的类型和顺序。要获取环境变量,请使用此闭包:
int main(int argc, char ** myCommandLineArguments, char ** myEnvironmentVars)
这就是你想知道的吗?在C程序中,操作系统会创建指向以零结尾的字符串的指针数组。计数作为
argc
传递,数组作为argv
传递。你已经知道了。名称argc
和argv
无关紧要。你可以用任何名字。数据类型和顺序很重要argv
必须是int
和argc
必须是char*[]
或char**
。其他语言也有类似的机制。例如,C#传递一个string[]
参数,该参数是一个.NET数组,并在内部跟踪其长度。有关更多信息,请访问:
环境变量名与程序中的变量名是分开的<代码>argc和argv
不是环境变量。。。它们是main()
的本地变量
要访问环境变量,请使用getenv()
更新:您想知道这些是如何提供给程序的。是操作系统做到了这一点。但是在操作系统可以这样做之前,调用您的可执行文件(调用者)的程序将处理您的命令行。通常,调用方是shell(
bash
、csh
、zsh
、cmd.exe
)或像GNOME或Windows Explorer这样的桌面环境。调用者通过(on*nix)或(在Windows上)传递这些参数。我将尝试比其他答案更详细地解释实现。我肯定有不准确的地方,但希望它能很好地描述相关部分。
在shell下,键入
/myprog a b c
shell对其进行解析,并确定您希望使用三个参数运行
/myproj
。它调用
fork
,以创建一个新进程,其中将运行/myprog
。仍然运行shell程序的子进程准备了一个由5个字符组成的指针数组。第一个将指向字符串
/prog
,下三个指向字符串a
、b
和c
,最后一个设置为NULL。接下来,它调用
execve
函数,在创建参数数组的情况下运行/myprog
。execve
将/myprog
加载到内存中,而不是shell程序。它释放shell程序分配的所有内存,但确保保留参数数组。在新程序中,调用了
main
,并将参数数组作为argv
传递给它为什么您认为不能作为argp[i]访问它们?(请注意,函数参数名称在编译程序中通常没有意义,将2.参数命名为main
argv
只是一种惯例,如果需要,可以将其命名为FOOBAR
)main
的参数与任何其他函数的参数一样。名称并不重要,您甚至可以在函数原型和实际函数中使用不同的参数名称,只要类型匹配即可。main
的参数来自何处并不重要,只需将它们视为任何整数和指针数组(在您的例子中是指向指针的指针)。谢谢您的回答。实际上,我的问题不是如何访问它们,而是关于谁以及如何使它们可用于程序。为什么execve
不需要argc
参数?实际上,数组将包含五个条目,不要忘记第一个(第零个)中的程序名它可能使用fork exec以外的其他机制来实际创建新进程。这完全取决于操作系统,就本问题而言,这并不重要。无论操作系统和shell使用何种机制来运行命令,都必须传递命令行参数。这是一种类似UNIX的操作方式,其中参数由fork
和“survive”execve
@JoachimPileborg“克隆”,感谢您的更正,我编辑了答案。@SteveJessop,您是对的,我解释了一个实现,它可能不是对任何操作系统的准确描述。但我认为,描述一个简单的机制,它本可以用来帮助你更好地理解事情,而不仅仅是说你保证得到什么。