我知道argv[0]
表示可执行文件名,但我不明白它是如何实现的 - 如何获取源代码级别的文件名和选项。起初我以为它依赖于linux中的内置函数,但后来发现windows也支持它,让我相信它可能是由编译器完成的?
答案 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的评论,您可以通过以下方式检索这些值:
/proc/self/cmdline
_NSGetArgc
/ _NSGetArgv
或[NSProcessInfo arguments]
GetCommandLine()
CommandLineToArgvW()
答案 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