存储命令行参数的位置?

时间:2010-01-22 05:41:40

标签: command-line command-line-arguments

我怀疑@存储命令行参数。

myprog.exe -cfgfile myconfig.cfg

命令行参数在创建进程时传递,因此它们是否在进程外部进行了操作?

OS存储它?

4 个答案:

答案 0 :(得分:5)

对于WIndows,命令行参数保存在进程环境块(PEB)中,该块在创建进程时在用户进程地址空间中分配。

您可以阅读Windows Internals以获取更多详细信息。这是一个snippet from Chapter 5 - Processes, Threads, and Jobs

我认为对于Unix风格来说它是一样的。这些数据需要在进程内存中,以便进程本身可以访问它。

答案 1 :(得分:2)

这取决于操作系统和可能的语言。一个好的以C为中心的答案是操作系统创建进程空间(包括加载代码,创建堆和堆栈等)。然后它将命令行参数向量放在一个位置,然后将参数向量的地址复制到堆栈上的'argv',并将单词的计数复制到'argc'。

只有在完成这些任务后,操作系统才允许执行该过程。

答案 2 :(得分:0)

命令行参数存储在应用程序的内存空间中。从操作系统到操作系统的不同之处,我的猜测通常是在堆的底部。把它放在那里的代码是在类Unix操作系统上的exec的内核源代码中,不确定它在Windows中的位置(不是你无论如何都可以看到源代码)。 C运行时代码(这是“crt”来自的地方)从堆栈中获取argv和argc,然后调用main。如果您有兴趣了解可执行文件如何在Linux中启动,那么Ulrich Drepper(glibc维护者)的这篇论文可能很有价值:http://people.redhat.com/drepper/dsohowto.pdf

答案 3 :(得分:0)

Linux中的

: 命令行参数将存储在堆栈中。 不要将环境变量与命令行参数混淆,进程地址空间对于环境变量具有单独的内存区域