GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum wird Sigint nicht an den untergeordneten Prozess weitergegeben, wenn er an den übergeordneten Prozess gesendet wird?

Bei einem Shell-Prozess (z.B. sh ) und seinen untergeordneten Prozess (z. B. cat ), wie kann ich das Verhalten von Ctrl simulieren +C die Prozess-ID der Shell verwenden?

Das habe ich versucht:

Ausführen von sh und dann cat :

[[email protected] ~]$ sh
sh-4.3$ cat
test
test

Senden von SIGINT zu cat von einem anderen Terminal:

[[email protected] ~]$ kill -SIGINT $PID_OF_CAT

cat das Signal empfangen und beendet (wie erwartet).

Das Senden des Signals an den übergeordneten Prozess scheint nicht zu funktionieren. Warum wird das Signal nicht an cat weitergeleitet wenn es an seinen übergeordneten Prozess sh gesendet wird ?

Das funktioniert nicht:

[[email protected] ~]$ kill -SIGINT $PID_OF_SH

Akzeptierte Antwort:

Wie CTRL +C funktioniert

Als erstes müssen Sie verstehen, wie CTRL +C funktioniert.

Wenn Sie CTRL drücken +C , sendet Ihr Terminal-Emulator ein ETX-Zeichen (end-of-text / 0x03).
Das TTY ist so konfiguriert, dass es beim Empfang dieses Zeichens ein SIGINT an die Vordergrundprozessgruppe des Terminals sendet. Diese Konfiguration kann angezeigt werden, indem Sie stty -a ausführen und schauen Sie sich intr = ^C; an .
Die POSIX-Spezifikation besagt, dass beim Empfang von INTR ein SIGINT an die Vordergrundprozessgruppe dieses Terminals gesendet werden soll.

Was ist die Vordergrundprozessgruppe?

Nun stellt sich also die Frage, wie bestimmen Sie, was die Vordergrundprozessgruppe ist?
Die Vordergrundprozessgruppe ist einfach die Gruppe von Prozessen, die alle von der Tastatur erzeugten Signale empfangen (SIGTSTP, SIGINT usw.).

Der einfachste Weg, die Prozessgruppen-ID zu ermitteln, ist die Verwendung von ps :

ps ax -O tpgid

Die zweite Spalte ist die Prozessgruppen-ID.

Wie sende ich ein Signal an die Prozessgruppe?

Da wir nun die Prozessgruppen-ID kennen, müssen wir das POSIX-Verhalten simulieren, ein Signal an die gesamte Gruppe zu senden.

Dies kann mit kill erfolgen durch Setzen eines - vor der Gruppen-ID.
Wenn Ihre Prozessgruppen-ID beispielsweise 1234 ist, würden Sie Folgendes verwenden:

kill -INT -1234

Simulieren Sie CTRL +C mit der Terminalnummer.

Das Obige deckt also ab, wie man CTRL simuliert +C als manueller Prozess. Was aber, wenn Sie die TTY-Nummer kennen und CTRL simulieren möchten +C für dieses Terminal?

Das wird sehr einfach.

Verwandte:Bash-Konvertierung von \xC3\x89 in É?

Nehmen wir an $tty ist das Terminal, auf das Sie abzielen möchten (dies erhalten Sie, indem Sie tty | sed 's#^/dev/##' ausführen im Terminal).

kill -INT -$(ps h -t $tty -o tpgid | uniq)

Dadurch wird ein SIGINT an die Vordergrundprozessgruppe von $tty gesendet ist.
 


Linux
  1. Warum ist die PGID der untergeordneten Prozesse nicht die PGID des übergeordneten Prozesses?

  2. Wie kann man einen untergeordneten Prozess sterben lassen, nachdem der übergeordnete Prozess beendet wurde?

  3. Der untergeordnete Prozess empfängt das SIGINT des übergeordneten Prozesses

  4. Bash:Warum wird das übergeordnete Skript nicht bei SIGINT beendet, wenn das untergeordnete Skript SIGINT abfängt?

  5. Wie kann man einen mit subprocess.check_output() erstellten Python-Kindprozess beenden, wenn der Elternteil stirbt?

Warum ist der untergeordnete Prozess noch am Leben, nachdem der übergeordnete Prozess in Linux beendet wurde?

Wann ist setsid() nützlich oder warum müssen wir Prozesse in Linux gruppieren?

So erhalten Sie einen untergeordneten Prozess aus einem übergeordneten Prozess

Warum kann ich diesen Prozess unter Linux nicht beenden?

Wann sendet das System ein SIGTERM an einen Prozess?

Warum habe ich keine Syntaxhervorhebung, wenn ich sudo vi <Dateiname> drücke?