Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 捕获信号发送器的pid_Perl_Signals - Fatal编程技术网

Perl 捕获信号发送器的pid

Perl 捕获信号发送器的pid,perl,signals,Perl,Signals,在handle_sigint中,我想打印发送信号的人(pid/进程名称)。 有没有办法用perl捕获这些信息 我可以在C中完成这项工作,并将其作为一个模块移植到python中 我正在寻找perl中的等效语言 local $SIG{INT} = \&handle_sigint; sub handle_sigint { print "received sigint\n"; } 我们的进程从内核得到的只是信号,我相信它只是一个整数。此外,信号可能来自各种事件,而不仅仅是另一个过程

在handle_sigint中,我想打印发送信号的人(pid/进程名称)。
有没有办法用perl捕获这些信息

我可以在C中完成这项工作,并将其作为一个模块移植到python中
我正在寻找perl中的等效语言

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

}

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

所有这些都不在信号中


更新问题编辑

添加的C代码并不完全使用信号本身,而是查询更多。Perl中的类似方法在中进行了讨论,在注释中发现


至于从
siginfo\u t
中挖掘这些信息,POSIX::SigAction旨在公开这些字段,但显然没有。您最好编写自己的扩展名,或者按照

的建议尝试使用。您可以将sau SIGINFO和signalfd结合起来,找出发送信号的进程的pid


请参阅:

非常确定答案是“否”,因为这是一个内核空间问题,但我不确定我是否能找到相关的参考。我能够用python捕获此信息,因为我编写了一个c扩展模块来捕获它,但如果它可以作为perlOK的端口,则idk。在最坏的情况下,您可以将C内联到perl中。我并不认为信号处理程序传递了这些信息。你是说在perl中不是吗?它在c/python上工作。我测试了自己我怀疑原因可能是perl提供了“安全信号”,而任何基于C的解决方案都没有。
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;
    }
}