bash使用什么打开/执行argv ?

如果这是一个愚蠢的问题,我提前道歉,但是深入我深入了解,我更加困惑。 我自学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是传递给新程序的参数字符串数组。 按照惯例 ,这些字符串中的第一个应该包含与正在执行的文件相关的文件名。