命令行参数如何从shell传递到可执行文件?

时间:2018-07-02 15:52:09

标签: linux shell unix command-line command-line-arguments

当我做类似的事情

$ ./my-program foo bar

foobar如何从外壳传递到my-program的存储空间? my-program是否通过系统调用获取它们?复制它们是内核的工作吗?

(请注意,我知道如何读取和使用命令行参数。这不是我的问题。)

1 个答案:

答案 0 :(得分:4)

这是特定于操作系统的,但在GNU / Linux上:

  1. shell在其内存空间中将参数构建为C字符串。
  2. shell调用execve(2)并将指针传递给这些参数的NULL终止数组。
  3. 内核准备执行,包括构建新的内存映射,尤其是allocating the process stack
  4. 将内核copies the arguments放入新堆栈中。
  5. 内核从其初始_start符号开始调度进程
  6. 目标可执行文件正在运行
  7. 目标的glibc初始化程序(由gcc添加)copies the argument pointer from the stack
  8. 最终,使用指向参数数据的指针调用目标的main方法。
  9. 目标现在可以通过argv指针从其自身的存储空间访问参数。