appeler sigprocmask depuis bash

J'ai un process qui génère une command bash avec system() alors que le masque de signal a tous les signaux bloqués. Cela ne peut pas être réparé facilement.

La command bash finit par exec dans un process. Le masque de tous les signaux bloqués est hérité du process d'origine par bash jusqu'au process final, donc à la fin j'obtiens un process qui est "immunisé" à tous les signaux (sauf bien sûr SIGKILL , SIGSTOP , etc.).

La solution de contournement serait la réinitialisation de sigprocmask partir de bash, mais je ne trouve aucune command associée. Est-ce possible?

Il ne semble pas y avoir de solution pure bash.

Ksh (à la fois ksh93 et ​​mksh) débloque tous les signaux (testé sur Debian Wheezy), donc si vous pouvez utiliser ksh au lieu de bash, cela résoudra votre problème.

Si vous ne pouvez pas changer le fait que bash est invoqué, vous pouvez faire bash exécuter ksh et faire ksh exécuter le process fils: replace

 bash -c '…; exec child_process' 

par

 bash -c '…; exec ksh -c "exec child_process"' 

Méfiez-vous des problèmes de citation!

Ksh est rapide et facile à utiliser, mais ne fait souvent pas partie de l'installation par défaut. Si c'est un problème, vous pouvez utiliser Perl à la place, ce qui fait partie de l'installation par défaut dans la plupart des systèmes Linux non embarqués.

 perl -e ' use POSIX; $s = POSIX::SigSet->new(); $s->fillset(); sigprocmask(1, $s, $s) or die $!; # 1 = SIG_UNBLOCK exec "child_process"'