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;
}
}
答案 0 :(得分:1)
我们的进程从内核获取的所有信号都是信号,我相信它只是一个整数。此外,信号可能来自各种事件,而不仅仅是另一个过程。例如,man 7 signal
给出的列表揭示了各种可能的来源。
信号中没有的一切。
更新问题编辑
添加的C代码并不完全使用信号本身,但查询的内容更多。在this post中讨论了Perl中的类似方法,Syck在评论中挖掘出来。
至于从siginfo_t
挖掘这些信息,POSIX::SigAction
是为了暴露这些字段,但它显然没有。您可能最好自行编写自己的扩展程序,或按照Inline::C
答案 1 :(得分:1)
您可以组合SA_SIGINFO和signalfd来找出发送信号的进程的pid。
请参阅:How can I tell in Linux which process sent my process a signal