【问题标题】:How argv[0] worksargv[0] 的工作原理
【发布时间】:2012-12-28 10:24:53
【问题描述】:

我知道argv[0] 代表可执行文件名,但我不明白它是如何实现的——它如何在源代码级别 获取文件名和选项。一开始以为是依赖于linux的内置函数,后来发现windows也支持,让我相信可能是编译器做的吧?

【问题讨论】:

    标签: c command-line-arguments


    【解决方案1】:

    它实际上是C99 standard 的一部分,因此跨编译器和操作系统的实现相同。从5.1.2.2.1 程序启动(第 12 页):

    如果argc的值大于零,则argv[0]指向的字符串代表程序名;如果主机环境中没有程序名称,argv[0][0] 应为空字符。如果argc 的值大于1,则argv[1]argv[argc-1] 所指向的字符串代表程序参数

    编辑:跟进 Waleed Khan 的评论,您可以通过以下方式检索这些值:

    【讨论】:

    • 也许我没有澄清我的问题,我想知道它是如何在source code 级别实现的。
    • 这不是问题的答案
    • @ZhangYuan 源码层面没有实现。主机系统应提供此值。
    【解决方案2】:

    执行二进制文件时,glibc 调用函数 __libc_start_main,该函数将球传递给系统调用 execve,其中 argv/argc 被压入堆栈。

    内核解析堆栈为您填充 argv.. 所以如果您有兴趣修改或理解解析部分,您应该查看内核 execve 代码,如果您在 lxr 中遵循它,您将得到这个线,我相信这是你正在寻找的: http://lxr.linux.no/linux+v3.0/fs/exec.c#L1541

    【讨论】:

      【解决方案3】:

      http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=fs/exec.c#l1376 搜索 sys_execve() ,读取内核代码,就可以找到了。

      【讨论】:

        猜你喜欢
        • 2014-09-22
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        • 2019-01-24
        • 2021-03-20
        • 2011-10-26
        • 2017-12-02
        • 2014-04-04
        相关资源
        最近更新 更多