(Erneutes Posten unter Unix gemäß dem Vorschlag in /programming/13718394/what-should-interactive-shells-do-in-orphaned-process-groups )
Die kurze Frage ist, was sollte eine Shell tun, wenn sie sich in einer verwaisten Prozessgruppe befindet, der das tty nicht gehört? Aber ich empfehle, die lange Frage zu lesen, weil sie amüsant ist.
Hier ist eine unterhaltsame und aufregende Möglichkeit, Ihren Laptop mithilfe Ihrer Lieblingshülle in eine tragbare Raumheizung zu verwandeln (es sei denn, Sie sind einer dieser tcsh-Verrückten):
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
Dies führt dazu, dass bash die CPU auf 100% fixiert. zsh und fish machen dasselbe, während ksh und tcsh etwas über Jobkontrolle murmeln und dann umkippen, was ein bisschen besser ist, aber nicht viel. Oh, und es ist ein plattformunabhängiger Straftäter: OS X und Linux sind beide betroffen.
Meine (möglicherweise falsche) Erklärung lautet wie folgt: Die untergeordnete Shell erkennt, dass sie nicht im Vordergrund steht : tcgetpgrp(0) != getpgrp()
. Deshalb versucht es sich selbst zu stoppen : killpg(getpgrp(), SIGTTIN)
. Die Prozessgruppe ist jedoch verwaist, da die übergeordnete Gruppe (das C-Programm) der Anführer war und gestorben ist und SIGTTIN
an eine verwaiste Prozessgruppe gesendet wurde. Sie wird einfach gelöscht (andernfalls kann nichts erneut gestartet werden). Daher wird die untergeordnete Shell nicht gestoppt, sondern befindet sich immer noch im Hintergrund, sodass alles sofort wieder ausgeführt wird. Spülen und wiederholen.
Meine Frage ist, wie kann eine Befehlszeilen-Shell dieses Szenario erkennen und was ist das Richtige dafür? Ich habe zwei Lösungen, von denen keine ideal ist:
- Versuchen Sie, den Prozess zu signalisieren, dessen PID mit unserer Gruppen-ID übereinstimmt. Wenn dies fehlschlägt
ESRCH
, bedeutet dies, dass wir wahrscheinlich verwaist sind. - Versuchen Sie einen nicht blockierenden Lesevorgang von einem Byte aus
/dev/tty
. Wenn dies fehlschlägtEIO
, bedeutet dies, dass wir wahrscheinlich verwaist sind.
(Unser Problem, das dies verfolgt, ist https://github.com/fish-shell/fish-shell/issues/422 )
Danke für deine Gedanken!