我需要攔截和跟蹤任何二進制文件的信號,比如strace在linux下執行。 我不需要像真正的strace那樣輸出如此冗長的輸出。 我只是想知道它是如何工作的,我如何攔截信號,以及如何追蹤它們。 在此先感謝:)如何截取linux信號? (在C)
3
A
回答
3
strace使用ptrace()
系統調用進行跟蹤,這也允許您攔截(並可能操縱)發送到進程的信號。
這裏有一個小例子:
#include <sys/ptrace.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
/* simple example, child is traced, uses alarm which causes a signal to be
* set up */
pid_t child;
child = fork();
if (child == 0)
{
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
alarm(3);
while(1)
{
}
exit(0);
}
/* parent */
while(1)
{
int wstatus;
int signum;
wait(&wstatus);
if (WIFEXITED(wstatus) || WIFSIGNALED(wstatus))
break;
signum = WSTOPSIG(wstatus);
printf("child stopped with signal %d\n", signum);
/* resume execution */
ptrace(PTRACE_CONT, child, NULL, signum);
}
return 0;
}
1
這是最簡單的實現!
在int main()
幾個電話某處放至signal()
,每個信號你想趕上。第一個參數是信號名稱;第二個是信號處理函數(更多地在下面):
signal(SIGFPE, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGINT, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGTERM, SignalHandler);
#ifndef WIN32
signal(SIGHUP, SignalHandler);
signal(SIGQUIT, SignalHandler);
signal(SIGKILL, SignalHandler);
signal(SIGPIPE, SignalHandler);
signal(SIGCHLD, SignalHandler);
#endif
現在寫一個信號函數。它必須返回void並接受int:void SignalHandler(int signal_number)
:
void SignalHandler(int signal_number)
{
printf("Received signal: %s\n", strsignal(signal_number);
// Do something
}
就是這樣!您也可以通過使用功能raise(SIGNAL_NAME)
向您自己發送信號來測試它;例如,請嘗試raise(SIGTERM);
!
0
截取信號到其他進程是你除了調試以外不應該做的任何事情。這是strace的意圖。進程應該能夠處理他們自己的信號。
不用說,如果你正在寫一個調試器,瞭解ptrace的()。
相關問題
- 1. Linux C信號
- 2. 信號如何在linux(c)上工作?
- 3. C Linux信號處理
- 4. 信號+叉在linux
- 5. UNIX/Linux信號
- 6. 如何在linux中發信號線?
- 7. 如何截取撥號號碼(如ussd)
- 8. Linux/vxworks信號
- 9. Sigalrm(linux信號)
- 10. Linux:信號源
- 11. C/C++如何在linux上獲取處理器序列號
- 12. 在Linux中獲取GPU信息C
- 13. 在Linux計數信號量?
- 14. 誤差信號在linux
- 15. 在linux中捕獲信號
- 16. 與信號在Linux中
- 17. 如何在Linux中讀取SRAM信息?
- 18. linux c程序中的信號
- 19. Linux中的信號
- 20. Linux信號量:自旋鎖或信號?
- 21. 如何在Linux中使用C++獲取硬件信息
- 22. 如何在Windows和Linux上讀取C++中的系統信息?
- 23. OpenCL的Linux函數截取
- 24. Erlang Linux信號處理
- 25. 如何獲取selectionChanged信號
- 26. 如何接收在c程序(在Linux上)使用sigqueue發送的信號?
- 27. 如何在iOS中獲取信號條
- 28. 如何通過C庫獲取Linux硬件和系統信息?
- 29. 如何在C++中獲取cwd(Linux)
- 30. 如何在C++ linux中獲得3G調制解調器信號強度?