【问题标题】:How are command line parameters passed from shell to executable? [closed]命令行参数如何从 shell 传递到可执行文件? [关闭]
【发布时间】:2018-12-10 21:29:53
【问题描述】:

当我做类似的事情时

$ ./my-program foo bar

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

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

【问题讨论】:

  • 是的,这是内核工作。这是你期待的答案吗?
  • 可以接受一个更成熟的答案来解释高级别的机制。
  • 最终(在分词、变量插值等之后)shell 将调用exec* 系列系统调用的成员,并将参数传递给它。 man execve
  • exec 系列系统调用。它创建一个进程,其中命令行参数已经在某个预定义的地址到位。
  • 考虑到Unix & Linux 关注 UNIX 实现细节的问题,作为学术好奇心的问题; StackOverflow 的范围仅限于实用、关于软件开发的可回答问题。

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


【解决方案1】:

这是特定于操作系统的,但在 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 指针从它自己的内存空间访问参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多