Envoi d’un signal à un script perl pendant qu’il ferme un descripteur de fichier

J’ai le problème suivant, que j’ai reconstruit dans ces deux mini scripts Perl. Ceci est le script principal:

#!/usr/bin/perl $SIG{INT} = \&signal_handler_one; open(my $pipe, "|-", "/home/pa/Desktop/POC2"); close $pipe; sub signal_handler_one{ print "This is expected to print\n"; } 

Sur la troisième ligne, il ouvre un canal vers ce script:

 #!/usr/bin/perl $SIG{INT} = \&signal_handler_two; sleep(10); sub signal_handler_two{ print "This isn't expected to print\n"; } 

Le problème est que lorsque je lance le premier script et que je lui envoie SIGINT pendant qu’il ferme le canal sur la ligne 4, le signal_handler_two est déclenché au lieu de signal_handler_one. Pourquoi se comporte-t-il comme ça? Y a-t-il un moyen de contourner ce problème (mon objective est de faire en sorte que signal_handler_one s’exécute).

Edit : J’ai initialement envoyé le signal sur le terminal en utilisant Ctrl + C, ce qui provoque l’impression de “Ceci n’est pas censé imprimer”. Mais lorsque j’envoie le signal en utilisant kill au processus parent depuis un autre terminal, il l’ignore.

Edit 2 : Je l’ai finalement résolu en n’utilisant pas open pour obtenir le tube, mais en forking , en exécutant et en attendant manuellement l’enfant au lieu d’appeler simplement close . Maintenant, tout semble fonctionner correctement. Il semble que ce comportement était spécifique à mon environnement, mais si quelqu’un pouvait reproduire cette même erreur, faites-le moi savoir.

Je ne peux pas reproduire le comportement que vous observez. Lorsque j’appuie sur CTRL-C dans le terminal, l’enfant et le parent reçoivent immédiatement SIGINT :

 use diagnostics; use feature qw(say); use ssortingct; use warnings; $SIG{INT} = sub { say "This is expected to print"; die }; my $pid = open ( my $pipe, "|-", "script.pl" ); say "PID = $pid"; eval { say "Closing.."; my $close_ok = close $pipe; # Note "close" here waits for child to exit if ( ! $close_ok ) { say "Error closing: $!"; } else { say "Close done."; } }; if ( $@ ) { say "Parent caught SIGINT."; } 

script.pl est:

 #! /usr/bin/env perl use feature qw(say); use ssortingct; use warnings; $SIG{INT} = sub { die }; eval { say "Sleeping.."; for (1..5) { sleep 1; say $_; } }; if ( $@ ) { say "Child caught SIGINT."; exit; } 

la sortie de l’exécution du premier programme dans le terminal ( gnome-terminal sur Ubuntu 16.04) est la suivante:

 PID = 1746 Closing.. Sleeping.. 1 2 ^CThis is expected to print Child caught SIGINT. Parent caught SIGINT. Uncaught exception from user code: refcnt: fd -1 < 0 

Notez qu'il existe une exception non refcnt: fd -1 < 0 . Je n'ai aucune idée de ce que c'est. Peut-être parce que la close n'a pas réussi?