1

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

4

3 回答 3

6

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

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

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

于 2012-12-27T04:52:19.053 回答
0

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

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

于 2012-12-28T02:24:53.673 回答
-1

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

于 2012-12-27T05:28:21.040 回答