首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何拦截linux信号?(C格式)

如何拦截linux信号?(C格式)
EN

Stack Overflow用户
提问于 2009-12-20 19:14:53
回答 3查看 6.5K关注 0票数 3

我需要拦截和跟踪来自任何二进制文件的信号,就像strace在linux下所做的那样。我不需要像真正的strace那样冗长的输出。我只想知道它是如何工作的,我如何截获信号,以及如何追踪它们。提前感谢:)

EN

回答 3

Stack Overflow用户

发布于 2009-12-20 20:07:08

strace使用ptrace()系统调用进行跟踪,这也允许您拦截(并可能操纵)发送到进程的信号。

这里有一个很小的例子:

代码语言:javascript
复制
#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;
}
票数 4
EN

Stack Overflow用户

发布于 2009-12-20 20:11:07

这是一个简单的实现:

在你的int main()中的某个地方放几个对signal()的调用,一个对应你想要捕捉的信号。第一个参数是信号名称;第二个参数是信号处理函数(下面将详细介绍):

代码语言:javascript
复制
    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

现在,编写一个信号函数。它必须返回空并接受一个int:void SignalHandler(int signal_number)

代码语言:javascript
复制
void SignalHandler(int signal_number)
{
    printf("Received signal: %s\n", strsignal(signal_number);
    // Do something
}

就这样!您还可以通过使用函数raise(SIGNAL_NAME)向自己发送一个信号来测试它;例如,尝试raise(SIGTERM);

票数 2
EN

Stack Overflow用户

发布于 2009-12-20 20:14:42

截获到其他进程的信号是除了调试它们之外的任何原因都不应该做的事情。这就是strace的用途。进程应该能够处理自己的信号。

不用说,如果您正在编写调试器,请理解ptrace()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1935537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档