【发布时间】:2012-12-28 10:24:53
【问题描述】:
我知道argv[0] 代表可执行文件名,但我不明白它是如何实现的——它如何在源代码级别 获取文件名和选项。一开始以为是依赖于linux的内置函数,后来发现windows也支持,让我相信可能是编译器做的吧?
【问题讨论】:
我知道argv[0] 代表可执行文件名,但我不明白它是如何实现的——它如何在源代码级别 获取文件名和选项。一开始以为是依赖于linux的内置函数,后来发现windows也支持,让我相信可能是编译器做的吧?
【问题讨论】:
它实际上是C99 standard 的一部分,因此跨编译器和操作系统的实现相同。从5.1.2.2.1 程序启动(第 12 页):
如果
argc的值大于零,则argv[0]指向的字符串代表程序名;如果主机环境中没有程序名称,argv[0][0]应为空字符。如果argc的值大于1,则argv[1]到argv[argc-1]所指向的字符串代表程序参数。
编辑:跟进 Waleed Khan 的评论,您可以通过以下方式检索这些值:
/proc/self/cmdline
_NSGetArgc / _NSGetArgv 或 [NSProcessInfo arguments]
GetCommandLine() 和 CommandLineToArgvW()
【讨论】:
source code 级别实现的。
执行二进制文件时,glibc 调用函数 __libc_start_main,该函数将球传递给系统调用 execve,其中 argv/argc 被压入堆栈。
内核解析堆栈为您填充 argv.. 所以如果您有兴趣修改或理解解析部分,您应该查看内核 execve 代码,如果您在 lxr 中遵循它,您将得到这个线,我相信这是你正在寻找的: http://lxr.linux.no/linux+v3.0/fs/exec.c#L1541
【讨论】:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=fs/exec.c#l1376 搜索 sys_execve() ,读取内核代码,就可以找到了。
【讨论】: