En C, lo que puedo decir¿Cómo, en Perl 5, puedo obtener el pid del proceso que me envió una señal?
#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;
}
Esto muestra algo así como
pid is 31980
got signal 15 from process 31985 running as user 1000
cuando se envía un SIGTERM
del proceso de 31985.
Puedo escribir semejante código Perl 5 utilizando 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;
Pero el controlador aún solo recibe un argumento (la señal). ¿Cómo puedo obtener una estructura de siginfo_t
? ¿Tengo que escribir mi propio código XS que configura su propio controlador y luego pasa la información a una devolución de llamada de Perl? ¿Escribo mi intérprete en XS de alguna manera?
Ojalá pudiera votar esto más de una vez. Es una pregunta tremendamente excelente. ¿Has mirado el código XS existente desde el módulo POSIX? No lo he hecho, pero apuesto a que ahí reside la respuesta a su pregunta. En cuanto a atornillar el intérprete, ¿sabe usted que las "señales de seguridad" cambian al bucle del intérprete? – tchrist
@tchrist Sí, sé sobre el cambio que sucedió en algún punto de la línea 5.8. Eso es algo de lo que me preocupaba. No sé cómo interactuar con cómo funciona eso. Leer las cosas de POSIX XS es probablemente el camino a seguir. Esperaba que alguien ya hubiera hecho el trabajo duro por mí. –
Si a @tchrist le gusta, eso es suficiente para mí: +1 –