【发布时间】:2015-02-07 20:02:08
【问题描述】:
如果这是一个愚蠢的问题,我提前道歉,但是我越深入研究它就越感到困惑。我正在自学 C,最近一直在研究文件“打开”相关的函数和宏,以便更好地了解到底发生了什么。
所以,我的愚蠢问题是,在运行 Centos 6.6 并使用 Bash shell 的系统上,当从命令提示符调用程序时,究竟是什么打开了 argv[0] 以执行?
我已经尝试过(我相信被称为)拦截程序并通过 LD_PRELOAD 指令导出共享对象文件,并且可以跟踪至少一些对“open”和“open64”的调用。
我使用的调试样式打印语句为我提供了正在打开的文件名,但是我注意到从命令行调用的程序(我假设为 argv[0])看起来不像被引用这些中的任何一个。
这导致我开始苦苦研究 bash 源代码,但没有取得任何实际进展。
我非常感谢任何关于我可能需要寻找什么以及在哪里寻找的指示?我在 argv、argv(、main(、execev、ioctl 和 fcntl 上进行了 grep'ed,谷歌搜索并搜索了留言板,但没有取得进展。
我将非常感谢任何关于此的建议或指示。
【问题讨论】:
-
exec*系列函数是您想要跟踪的。执行文件和打开文件是完全不同的两件事。 -
shell
fork一个新进程和exec文件,所以它根本不涉及open。 -
exec*()系列函数负责读取指定为第一个参数的文件。您不会看到单独的用户级打开操作;它由内核在内部处理。 -
这个问题真的没有意义; shell不以任何有意义的方式执行
argv[0]。被调用的命令的路径是 execv 系列函数的一个独立参数,来自其参数向量。