En C, je peux dire
#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;
}
Ce imprime quelque chose comme
pid is 31980
got signal 15 from process 31985 running as user 1000
lors de l'envoi d'un SIGTERM
de processus 31985.
Je peux écrire similaire Perl 5 code à l'aide d' POSIX::sigaction
:
#!/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;
Mais le maître toujours reçoit un seul argument (le signal). Comment puis-je obtenir à l' siginfo_t
de la structure? Dois écrire mon propre code XS qui met en place son propre gestionnaire, puis transmet les informations à un Perl de rappel? Sera écrit mon propre gestionnaire de XS à vis jusqu'à l'interprète d'une certaine façon?