(Nouvelle publication sous Unix selon la suggestion de /programming/13718394/what-should-interactive-shells-do-in-orphaned-process-groups )
La courte question est, que doit faire un shell s'il se trouve dans un groupe de processus orphelin qui ne possède pas le tty? Mais je recommande de lire la longue question car c'est amusant.
Voici une façon amusante et passionnante de transformer votre ordinateur portable en radiateur portatif, en utilisant votre coque préférée (à moins que vous ne soyez un de ces bizarres tcsh):
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
Cela amène bash à fixer le CPU à 100%. zsh et fish font de même, tandis que ksh et tcsh marmonnent quelque chose à propos du contrôle des tâches, puis quille, ce qui est un peu mieux, mais pas beaucoup. Oh, et c'est un contrevenant indépendant de la plate-forme: OS X et Linux sont tous deux touchés.
Mon (potentiellement mauvais) explication est la suivante: la coquille de l' enfant détecte qu'il est pas au premier plan: tcgetpgrp(0) != getpgrp()
. Par conséquent , il essaie de s'arrêter: killpg(getpgrp(), SIGTTIN)
. Mais son groupe de processus est orphelin, car son parent (le programme C) était le leader et est décédé, et SIGTTIN
envoyé à un groupe de processus orphelin est juste abandonné (sinon rien ne pourrait le redémarrer). Par conséquent, le shell enfant n'est pas arrêté, mais il est toujours en arrière-plan, il recommence donc tout de suite. Rincez et répétez.
Ma question est, comment un shell de ligne de commande peut-il détecter ce scénario, et quelle est la bonne chose à faire? J'ai deux solutions, dont aucune n'est idéale:
- Essayez de signaler le processus dont le pid correspond à notre ID de groupe. Si cela échoue
ESRCH
, cela signifie que nous sommes probablement orphelins. - Essayez une lecture non bloquante d'un octet de
/dev/tty
. Si cela échoueEIO
, cela signifie que nous sommes probablement orphelins.
(Notre problème de suivi est https://github.com/fish-shell/fish-shell/issues/422 )
Merci pour vos pensées!