繁体   English   中英

如何拦截linux信号? (在C中)

[英]how to intercept linux signals ? (in C)

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

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;
}

这是一个简单的实现:

在你的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);

除了调试之外,您不应该因为任何原因而截取到其他进程的信号。 这就是strace的用途。 进程应该能够处理自己的信号。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM