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.