open()和open64()的包装器,并看到vi的系统调用使用open64()
我已经为open()
和open64(
)编写了包装器。 现在我通过使用LD_PRELOAD
环境变量预加载我的包装器库来运行vi,我看到使用了open64()
包装器而不是open()
。 但是当我使用vi时,我发现系统调用是open()
(当然包括其他系统调用)。 这是什么问题?
strace实用程序跟踪系统调用 (syscall)和open恰好是系统调用和库函数。 open()
和open64()
库函数都在内部使用open
syscall来从内核请求服务。 我的理解是,使用带有O_LARGEFILE
标志的open()
相当于使用open64()
来支持32位应用程序中的大文件。
如果对open64()
的调用是在内部调用open()
函数,则不会调用open()
包装器,因为你不能插入内部库函数调用。 它们在运行时之前被解析。
你在64位系统上运行吗? 如果是这样,那就不足为奇了。 strace跟踪实际系统调用,而不是调用库中的哪些函数。 在64位系统上, open
和open64
由同一个系统调用实现。