【发布时间】:2011-10-15 07:04:00
【问题描述】:
- 如何通过外部进程实现?比如说,进程 A 想知道进程 B 中的系统调用是什么?喜欢 strace?
- 如何打印出进程本身调用的系统调用?喜欢注册一些活动吗?
谢谢!
【问题讨论】:
-
@Nobody,没错,一开始没注意到你的评论。
标签: c++ c linux system-calls
谢谢!
【问题讨论】:
标签: c++ c linux system-calls
如果只是特定的系统调用(不是全部),您可以重写 C 存根函数并将其放置在共享库中,并通过设置 LD_PRELOAD 在执行目标应用程序之前预加载该库。
当动态链接器解析函数调用时,这会导致您的函数优先于 C 库提供的函数。
这仅适用于动态链接的应用程序(几乎所有),并且您需要与所使用的 C 库二进制兼容。由于几乎所有 linux 都使用 glibc,并且不同的 glibc 版本是二进制兼容的,这应该不是问题。
您可以查看 fakeroot(作为示例)来了解如何操作。
添加: 您还可以将调用转发到 C 库中的实际实现,而不是重新实现整个系统调用包装器。我假设您需要手动加载库并解析地址(不确定,否则您可能最终会调用自己)。
【讨论】:
使用 ps 或其他方式检查进程 ID。然后运行“strace -p pidnumber”。
您可以检查 strace 的工作方式、源代码是否可用,或者您可以只在程序中调用 strace...
【讨论】: