捕获信号发送者

时间:2016-09-27 08:43:20

标签: perl signals

local $SIG{INT}  = \&handle_sigint;
sub handle_sigint {
    print "received sigint\n";

}
在handle_sigint中的

我想打印谁(pid /进程名称)发送信号 有没有办法在perl中捕获该信息?

我可以在C中执行此操作,并将其作为模块移植到python中 我正在寻找perl中的等价物

static void csignal_handler(int signum, siginfo_t *siginfo, void *context) {

    char *interrupt_msg[150];
    if (siginfo->si_pid != 0) {
       struct passwd *pwd = getpwuid(siginfo->si_uid);
        if (pwd != 0) {
            sprintf(interrupt_msg, "Received signal '%d' from process '%d' (%s) of user '%s'\n",
                signum, siginfo->si_pid, get_process_name_by_pid(siginfo->si_pid), pwd->pw_name);

        } else {
            sprintf(interrupt_msg, "Received signal '%d' from process '%d' (%s) of user '%d'\n",
               signum, siginfo->si_pid, get_process_name_by_pid(siginfo->si_pid), siginfo->si_uid);

        }

        printf("%s", interrupt_msg);
    }
    if (raise_interrupt) {
        PyGILState_STATE gstate = PyGILState_Ensure();
        PyErr_SetString(PyExc_KeyboardInterrupt, interrupt_msg );
        PyGILState_Release(gstate);
    } else {
        interrupted = 1;
    }
}

2 个答案:

答案 0 :(得分:1)

我们的进程从内核获取的所有信号都是信号,我相信它只是一个整数。此外,信号可能来自各种事件,而不仅仅是另一个过程。例如,man 7 signal给出的列表揭示了各种可能的来源。

信号中没有的一切。

更新问题编辑

添加的C代码并不完全使用信号本身,但查询的内容更多。在this post中讨论了Perl中的类似方法,Syck在评论中挖掘出来。

至于从siginfo_t挖掘这些信息,POSIX::SigAction是为了暴露这些字段,但它显然没有。您可能最好自行编写自己的扩展程序,或按照Inline::C

的建议使用sobrique进行尝试

答案 1 :(得分:1)

您可以组合SA_SIGINFO和signalfd来找出发送信号的进程的pid。

请参阅:How can I tell in Linux which process sent my process a signal