GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Sigint Tidak Dipropagasi ke Proses Anak Saat Dikirim ke Proses Induknya?

Diberikan proses shell (mis. sh ) dan proses turunannya (mis. cat ), bagaimana saya bisa mensimulasikan perilaku Ctrl +C menggunakan ID proses shell?

Ini yang saya coba:

Menjalankan sh lalu cat :

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

Mengirim SIGINT untuk cat dari terminal lain:

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

cat menerima sinyal dan dihentikan (seperti yang diharapkan).

Mengirim sinyal ke proses induk tampaknya tidak berhasil. Mengapa sinyal tidak disebarkan ke cat ketika dikirim ke proses induknya sh ?

Ini tidak berfungsi:

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

Jawaban yang Diterima:

Bagaimana CTRL +C bekerja

Hal pertama adalah memahami bagaimana CTRL +C bekerja.

Saat Anda menekan CTRL +C , emulator terminal Anda mengirimkan karakter ETX (teks akhir / 0x03).
TTY dikonfigurasi sedemikian rupa sehingga ketika menerima karakter ini, ia mengirimkan SIGINT ke grup proses latar depan terminal. Konfigurasi ini dapat dilihat dengan melakukan stty -a dan melihat intr = ^C; .
Spesifikasi POSIX mengatakan bahwa ketika INTR diterima, ia harus mengirim SIGINT ke grup proses latar depan terminal itu.

Apa yang dimaksud dengan grup proses latar depan?

Jadi, sekarang pertanyaannya adalah, bagaimana Anda menentukan apa itu grup proses latar depan?
Grup proses latar depan hanyalah grup proses yang akan menerima sinyal apa pun yang dihasilkan oleh keyboard (SIGTSTP, SIGINT, dll).

Cara termudah untuk menentukan ID grup proses adalah dengan menggunakan ps :

ps ax -O tpgid

Kolom kedua akan menjadi ID grup proses.

Bagaimana cara mengirim sinyal ke grup proses?

Sekarang setelah kita mengetahui apa ID grup proses, kita perlu mensimulasikan perilaku POSIX dalam mengirimkan sinyal ke seluruh grup.

Ini dapat dilakukan dengan kill dengan meletakkan - di depan ID grup.
Misalnya, jika ID grup proses Anda adalah 1234, Anda akan menggunakan:

kill -INT -1234

Simulasikan CTRL +C menggunakan nomor terminal.

Jadi di atas mencakup cara mensimulasikan CTRL +C sebagai proses manual. Tetapi bagaimana jika Anda mengetahui nomor TTY, dan Anda ingin mensimulasikan CTRL +C untuk terminal itu?

Ini menjadi sangat mudah.

Terkait:Bash mengonversi \xC3\x89 ke ?

Mari kita asumsikan $tty adalah terminal yang ingin Anda targetkan (Anda bisa mendapatkannya dengan menjalankan tty | sed 's#^/dev/##' di terminal).

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

Ini akan mengirim SIGINT ke apa pun grup proses latar depan $tty adalah.
 


Linux
  1. Mengapa Cd Bukan Program?

  2. Mengapa Proses Pgid Anak Bukan Pid Orang Tua?

  3. Linux – Mengapa Usb Tidak Berfungsi Di Linux Saat Berfungsi Di UEFA/bios?

  1. Bagaimana cara membuat proses anak mati setelah orang tua keluar?

  2. Proses anak menerima SIGINT orang tua

  3. Mengapa proses anak masih hidup setelah proses induk dimatikan di Linux?

  1. Kapan setsid() berguna, atau mengapa kita perlu mengelompokkan proses di Linux?

  2. Bash:Mengapa skrip induk tidak berhenti di SIGINT saat skrip anak menjebak SIGINT?

  3. Mengapa saya tidak bisa mematikan proses ini di Linux?