GNU/Linux >> Znalost Linux >  >> Linux

Proč není Sigint propagován do podřízeného procesu, když je odeslán jeho nadřazenému procesu?

Daný proces shellu (např. sh ) a jeho podřízený proces (např. cat ), jak mohu simulovat chování Ctrl +C pomocí ID procesu prostředí?

Zkoušel jsem toto:

Spuštění sh a poté cat :

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

Odesílání SIGINT na cat z jiného terminálu:

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

cat přijal signál a skončil (jak se očekávalo).

Zdá se, že odesílání signálu nadřazenému procesu nefunguje. Proč se signál nešíří do cat při odeslání jeho nadřazenému procesu sh ?

Toto nefunguje:

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

Přijatá odpověď:

Jak CTRL +C funguje

První věcí je pochopit, jak CTRL +C funguje.

Když stisknete CTRL +C , váš emulátor terminálu odešle znak ETX (konec textu / 0x03).
TTY je nakonfigurován tak, že když přijme tento znak, odešle SIGINT skupině procesů na popředí terminálu. Tuto konfiguraci lze zobrazit příkazem stty -a a podíváme se na intr = ^C; .
Specifikace POSIX říká, že když je přijat INTR, měl by odeslat SIGINT skupině procesů v popředí tohoto terminálu.

Co je to skupina procesů v popředí?

Nyní je tedy otázkou, jak určíte, co je to skupina procesů v popředí?
Skupina procesů v popředí je jednoduše skupina procesů, která bude přijímat jakékoli signály generované klávesnicí (SIGTSTP, SIGINT atd.).

Nejjednodušší způsob, jak určit ID skupiny procesů, je použít ps :

ps ax -O tpgid

Druhý sloupec bude ID skupiny procesů.

Jak pošlu signál skupině procesů?

Nyní, když víme, jaké je ID skupiny procesů, musíme simulovat chování POSIX při odesílání signálu celé skupině.

To lze provést pomocí kill vložením - před ID skupiny.
Pokud je například ID vaší procesní skupiny 1234, použili byste:

kill -INT -1234

Simulovat CTRL +C pomocí čísla terminálu.

Výše uvedené popisuje, jak simulovat CTRL +C jako manuální proces. Ale co když znáte číslo TTY a chcete simulovat CTRL +C pro tento terminál?

To je velmi snadné.

Související:Bash převést \xC3\x89 na É?

Předpokládejme $tty je terminál, na který chcete cílit (můžete to získat spuštěním tty | sed 's#^/dev/##' v terminálu).

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

To odešle SIGINT do jakékoli skupiny procesů v popředí $tty je.
 


Linux
  1. Proč není Pgid procesů dítěte PGID rodiče?

  2. Linux – Proč USB nefunguje v Linuxu, když funguje v Uefi/bios?

  3. Jak nechat podřízený proces zemřít po odchodu rodiče?

  1. Podřízený proces obdrží SIGINT rodiče

  2. Bash:Proč se nadřazený skript neukončí na SIGINT, když podřízený skript zachytí SIGINT?

  3. Jak zabít podřízený proces pythonu vytvořený pomocí subprocess.check_output(), když rodič zemře?

  1. Proč nemohu tento proces v Linuxu zabít?

  2. Kdy systém odešle SIGTERM procesu?

  3. Když se proces rozvětví, zkopíruje se jeho virtuální nebo rezidentní paměť?