Saya memiliki CD live yang menjalankan boot ke Linux dan menjalankan skrip Bash kecil. Script mencari dan menjalankan program kedua (yang biasanya merupakan biner C ++ yang dikompilasi).
Anda seharusnya dapat membatalkan program kedua dengan menekan Ctrl+ C. Apa yang harus terjadi adalah bahwa program kedua berhenti, dan skrip Bash terus menjalankan pembersihan. Apa yang sebenarnya terjadi adalah bahwa aplikasi utama dan skrip Bash berakhir. Yang merupakan masalah.
Jadi saya menggunakan trap
builtin untuk memberitahu Bash untuk mengabaikan SIGINT. Dan sekarang Ctrl+ Cmenghentikan aplikasi C ++, tetapi Bash terus menjalankannya. Bagus.
Oh ya ... Terkadang "aplikasi kedua" adalah skrip Bash yang lain. Dan dalam yang terjadi, Ctrl+ Csekarang tidak apa-apa pun .
Jelas pemahaman saya tentang cara kerja barang ini salah ... Bagaimana cara saya mengontrol proses mana yang mendapatkan SIGINT ketika pengguna menekan Ctrl+ C? Saya ingin mengarahkan sinyal ini ke satu proses tertentu saja .
set -m
. Ini sedikit lebih bersih dan sederhana daripada menggunakansetsid
setiap kali Anda menjalankan anak.Seperti yang saya sebutkan di komentar untuk f01, Anda harus mengirim SIGTERM ke proses anak. Berikut adalah beberapa skrip yang menunjukkan cara menjebak ^ C dan mengirim sinyal ke proses anak.
Pertama, orang tua.
tersentuh
Dan sekarang, anak itu.
sleeploop
Jika traptest mengirim SIGTERM hal-hal berperilaku baik, tetapi jika traptest mengirim SIGINT maka sleeploop tidak pernah melihatnya.
Jika sleeploop menjebak SIGTERM, dan sleep mode adalah foreground, maka sleeploop tidak menangkap sinyal sampai bangun dari sleep yang sekarang. Tetapi jika mode tidur adalah latar belakang, itu akan segera merespons.
sumber
Dalam skrip bash awal Anda.
melacak PID dari program kedua
menangkap SIGINT
ketika Anda telah menangkap SIGINT, kirim SIGINT ke PID program kedua
sumber