Perl 捕获信号发送器的pid
在handle_sigint中,我想打印发送信号的人(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"; } 我们的进程从内核得到的只是信号,我相信它只是一个整数。此外,信号可能来自各种事件,而不仅仅是另一个过程
有没有办法用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;
}
}