命令行参数如何工作?

Thu*_*man 3 c command-line-arguments

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

ugo*_*ren 8

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

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


Agn*_*ian 5

在 C 程序中,操作系统创建一个指向以零结尾的字符串的指针数组。计数作为 传递argc,数组作为 传递argv。你已经知道这一点了。名字argc并不argv重要。您可以使用任何名称。数据类型和顺序确实很重要...argv必须是int并且argc必须是char*[]or char**。其他语言也有类似的机制。例如,C# 传递一个string[].NET 数组参数,并在内部跟踪它的长度。更多信息请访问:http://en.wikipedia.org/wiki/Main_function#C_and_C.2B.2B

环境变量名称与程序中的变量名称是分开的。argc并且argv不是环境变量...它们是main().

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

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