如何拦截linux信号? (在C中)
我需要拦截和跟踪来自任何二进制文件的信号,就像 strace 在 Linux 下所做的那样。 我不需要像真正的 strace 这样冗长的输出。 我只是想知道它是如何工作的,如何拦截信号以及如何追踪它们。 提前致谢 :)
I need to intercept and trace signals from any binaries, like strace does it under linux.
I don't need a so verbose output like the real one strace.
I just want to know how it works, how can I intercept signal and how can I trace them.
Thanks in advance :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
strace 使用
ptrace()
系统调用进行跟踪,它还允许您拦截(并可能操纵)发送到进程的信号。这是一个小例子:
strace uses the
ptrace()
system call for tracing, which also allows you to intercept (and possibly manipulate) signals sent to the process.Here's a tiny example:
这是一个简单的实现:
在
int main()
中的某个位置放置对signal()
的多次调用,每个调用对应您要捕获的每个信号。第一个参数是信号名称;第二个是信号处理函数(更多内容见下文):现在,编写一个信号函数。它必须返回 void 并接受 int:
void SignalHandler(int signal_number)
:就是这样!您还可以通过使用函数
raise(SIGNAL_NAME)
向自己发送信号来测试它;例如,尝试raise(SIGTERM);
!This is a simple implementation:
Put somewhere in your
int main()
several calls tosignal()
, one for each signal you want to catch. The first argument is the signal name; the second is the signal handler function (more on that below):Now, write a signal function. It must return void and accept an int:
void SignalHandler(int signal_number)
:That's it! You can also test it by sending a signal to yourself with the function
raise(SIGNAL_NAME)
; for example, tryraise(SIGTERM);
!除了调试之外,您不应该出于任何原因拦截发送给其他进程的信号。这就是 strace 的目的。进程应该能够处理自己的信号。
不用说,如果您正在编写调试器,请了解 ptrace()。
Intercepting signals to other processes is something you should not do for any reason other than debugging them. This is what strace is intended for. Processes should be capable of handling their own signals.
Needless to say, if you are writing a debugger, understand ptrace().