argv [0]如何运作

时间:2012-12-27 04:46:33

标签: c command-line-arguments

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

3 个答案:

答案 0 :(得分:6)

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

  

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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