C语言 argv[0]的工作原理



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

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

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

编辑:按照Waleed Khan的评论,你可以通过以下方式获取这些值:
  • Linux - /proc/self/cmdline
  • OSX - _NSGetArgc/_NSGetArgv[NSProcessInfo arguments]
  • Windows - GetCommandLine() with CommandLineToArgvW()

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

内核解析堆栈为您填充argv。所以如果你对修改或理解解析部分感兴趣,你应该看看内核执行代码,如果你在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(),阅读内核代码,可以找到它

最新更新