在C,我可以說在Perl 5中,如何獲得向我發送信號的進程的pid?
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int continue_running = 1;
void handler(int signal, siginfo_t* info, void* data) {
printf("got signal %d from process %d running as user %d\n",
signal, info->si_pid, info->si_uid);
continue_running = 0;
}
int main(int argc, char** argv) {
struct sigaction sa;
sigset_t mask;
sigemptyset(&mask);
sa.sa_sigaction = &handler;
sa.sa_mask = mask;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGTERM, &sa, NULL);
printf("pid is %d\n", getpid());
while (continue_running) { sleep(1); };
return 0;
}
此打印出像
pid is 31980
got signal 15 from process 31985 running as user 1000
使用POSIX::sigaction
從工藝31985.
我可以寫類似的Perl 5代碼發送SIGTERM
時:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
use Data::Dumper;
my $sigset = POSIX::SigSet->new;
$sigset->emptyset;
my $sa = POSIX::SigAction->new(
sub { print "caught signal\n" . Dumper \@_; $a = 0 },
$sigset,
);
$sa->flags(POSIX::SA_SIGINFO);
$sa->safe(1); #defer the signal until we are in a safe place in the intrepeter
POSIX::sigaction(POSIX::SIGTERM, $sa);
print "$$\n";
$a = 1;
sleep 1 while $a;
但處理程序仍然只收到一個參數(信號)。我怎樣才能得到siginfo_t
結構?必須編寫自己的XS代碼來設置自己的處理程序,然後將這些信息傳遞給Perl回調函數?在XS中編寫我自己的處理程序會以某種方式搞砸解釋器嗎?
我希望我能不止一次地對此讚不絕口。這是一個非常優秀的問題。您是否查看了POSIX模塊中現有的XS代碼?我沒有,但我敢打賭,這是你問題的答案所在。至於搞砸解釋器,你是否意識到解釋器循環的「安全信號」改變? – tchrist 2011-06-09 16:53:51
@tchrist是的,我知道在5.8行的某個點發生的變化。這就是我所擔心的。我不知道如何連接這些東西的工作原理。閱讀POSIX XS的東西可能是要走的路。我希望有人已經爲我做了辛苦的工作。 – 2011-06-09 17:02:39
如果@tchrist喜歡它,那對我來說已經足夠了:+1 – 2011-06-09 17:12:05