如果这是一个愚蠢的问题,我提前道歉,但是深入我深入了解,我更加困惑。 我自学C,最近一直在研究文件“open”相关的函数和macros,以便更好地理解究竟发生了什么。
所以,我的愚蠢的问题是,在运行Centos 6.6的系统上,使用Bash shell,从命令提示符调用程序时,究竟打开了argv [0]来执行什么?
我已经尝试过(我相信被称为)拦截程序,并通过LD_PRELOAD指令导出共享目标文件,并可以跟踪至less一些调用“open”和“open64”。
我使用的debugging样式的打印语句给我打开的文件名,但我注意到,从命令行(我认为是argv [0])调用的程序不会显示,如果它被任何一个引用。
这导致我开始通过bash来源的抨击,并没有得到任何真正的进展。
我会非常感谢任何我可能需要寻找和在哪里的指针? 我已经对argv,argv(,main(,execev,ioctl和fcntl),search和search留言板grep'ed,但没有取得进展。
我非常感谢任何意见或指示。
获取bash的源代码(注意:这不是一个简单的shell – 这是一个非常复杂的程序):
git clone git://git.savannah.gnu.org/bash.git 。 看看文件execute_cmd.c和函数execute_disk_command()和shell_execve() 。
基本上execute_disk_command()执行一个fork() (通过辅助函数make_child()后跟一个execve() (通过shell_execve() )。
最后, execve()是所有程序调用的入口(在符合POSIX的平台上)。 它指示操作系统运行加载程序,准备执行新程序并最终使其进入运行状态(并将其保留给自己)。 提供给execve()的一个参数是一个字符串 – 指向磁盘上可执行文件的文件系统路径。 按照惯例,argv [0]被设置为相应的basename *。 参数被放置到新生成的程序的堆栈上,以便可以访问它们。
请参阅http://linux.die.net/man/2/execve :
int execve(const char * filename,char * const argv [],char * const envp []);
execve()执行文件名指向的程序。 文件名必须是二进制可执行文件,或者是以表单行开头的脚本:
#! interpreter [optional-arg]argv是传递给新程序的参数字符串数组。 按照惯例 ,这些字符串中的第一个应该包含与正在执行的文件相关的文件名。