我对@命令行参数的存储有疑问。
myprog.exe -cfgfile myconfig.cfg
创建进程时会传递命令行参数,因此它们是否存储在进程之外?
操作系统存储在哪里?
我对@命令行参数的存储有疑问。
myprog.exe -cfgfile myconfig.cfg
创建进程时会传递命令行参数,因此它们是否存储在进程之外?
操作系统存储在哪里?
对于 WINdows,命令行参数保存在进程环境块 ( PEB
) 中,该块在创建进程时分配在用户进程地址空间中。
您可以阅读 Windows Internals 了解更多详细信息。这是第 5 章 - 进程、线程和作业的片段。
我会假设它对于 Unix 风格是一样的。这些数据需要在进程内存中,以便进程本身可以访问它。
这取决于操作系统,也可能取决于语言。一个很好的以 C 为中心的答案是操作系统创建了进程空间(包括加载代码、创建堆和堆栈等)。然后它将命令行参数向量放在一个位置,然后将参数向量的地址复制到堆栈上的“argv”,并将字数复制到“argc”。
只有在这些任务完成后,操作系统才会允许进程执行。
命令行参数存储在应用程序的内存空间中。从操作系统到操作系统的确切不同之处在于,我的猜测是它通常位于堆的底部。将它放在那里的代码在类 Unix 操作系统上的 exec 的内核源代码中,不确定它在 Windows 中的位置(无论如何你都不能看到源代码)。C 运行时代码(这是“crt”的来源)从堆栈中获取 argv 和 argc,然后调用 main。如果您有兴趣了解更多可执行文件如何在 Linux 中启动,Ulrich Drepper(glibc 维护者)的这篇论文可能很有价值: http: //people.redhat.com/drepper/dsohowto.pdf
在 Linux 中:命令行参数将存储在堆栈中。不要将环境变量与命令行参数混淆,进程地址空间有单独的内存区域用于环境变量