C ++如何将命令行参数转换为数组?

时间:2012-09-01 20:35:55

标签: c++ arrays assembly command-line-arguments

我想C ++如何将命令行参数转换为char数组?什么“秘密”代码这样做?我在哪里可以查看执行此操作的代码(即使它在汇编中,我知道一些汇编)?我正在使用Linux,如果有帮助的话。

谢谢

5 个答案:

答案 0 :(得分:7)

在大多数(所有?)基于Unix的操作系统中,它们已经是一个数组。这就是操作系统在那里执行进程的方式 - 当进程启动时,已经有一系列参数可供它使用。

将命令行转换为数组的代码存在于shell(如bash)或启动另一个程序的任何其他程序中。 bash有可用的来源,其他程序 - 它是不同的。

在Windows中,它们是一个字符串(您可以使用GetCommandLine() API调用来修改它),它由C运行时库解析以将其转换为数组,因为语言规范要求它们作为阵列。

对于使用Visual C ++编译的程序,执行此操作的代码包含在Visual Studio分发中。您可能必须在安装程序中启用一个类似“Include C runtime library source”的复选框才能安装它。

答案 1 :(得分:2)

这通常由操作系统在为程序创建进程时处理。这段代码很好地用C语言编写(例如,如果操作系统是用C语言编写的),或者它可以在汇编中。要查找此代码,您可能需要查看操作系统代码。

希望这有帮助!

答案 2 :(得分:2)

管理命令行参数并在创建进程期间将其放入堆栈是一项操作系统工作。

对于POSIX系统,执行路径为:

  1. 在程序中调用execle / execve / ...系统调用,将路径传递给新的进程可执行文件和命令行参数。
  2. 此数据转到内核
  3. 内核更新其内部结构以考虑新的进程标识并为新进程分配地址空间(如果不再需要,内核也会清除旧的地址空间)。内核用零初始化进程内存,将信息从旧内存复制到堆栈顶部的新地址空间。
  4. 内核将新进程放入调度队列并从exec()系统调用返回,将执行路径传输到用户空间,最终传递到进程的入口点(这通常来自crt0.o对象文件,默认情况下链接到每个可执行文件 - 此例程调用main())。
  5. 对于Linux,您可以在此处看到此代码: http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/fs/exec.c#L383

    383 /*
    384  * 'copy_strings()' copies argument/environment strings from the old
    385  * processes's memory to the new process's stack.  The call to get_user_pages()
    386  * ensures the destination page is created and not swapped out.
    387  */
    

    在用户空间do_execve()系统调用的execve()内核对应中,在第1345行调用copy_strings()copy_strings()例程实际上就是你要求的工作约。

答案 3 :(得分:1)

它是c运行时库的一部分。如果您想知道这是什么,请查看此处:What is the C runtime library?

我刚刚使用Microsoft Visual Studio创建了一个基本的C ++控制台应用程序,并在程序的第一行设置了一个断点。调试时,程序在该行停止,并且您调用查找调用堆栈以查看调用“main”的函数。调用函数是c运行时的一部分,这似乎包含一些操作命令行的代码......我没有仔细看过,但这可能就是你应该从哪里开始的。

答案 4 :(得分:1)

有时它不是首先执行的实际main()。例如,在Visual Studio上,函数mainCRTStartup()充当入口点,调用Windows API来检索和解析命令行(如果使用调试器,则可以看到这一点)。