Proses dapat memilih untuk:
- abaikan sinyal SIGINT yang biasanya dikirim setelah ditekan Ctrl-C(seperti dengan
trap '' INT
di shell) atau memiliki handler sendiri untuk itu yang memutuskan untuk tidak mengakhiri (atau gagal untuk mengakhiri tepat waktu).
- beri tahu perangkat terminal bahwa karakter yang menyebabkan SIGINT dikirim ke pekerjaan latar depan adalah sesuatu yang lain (seperti dengan
stty int '^K'
di shell)
- beri tahu perangkat terminal untuk tidak mengirim sinyal apa pun (seperti dengan
stty -isig
dalam shell).
Atau, mereka bisa tidak terputus, seperti ketika di tengah panggilan sistem yang tidak dapat diganggu.
Di Linux (dengan kernel yang relatif baru), Anda dapat mengetahui apakah suatu proses mengabaikan dan / atau menangani SIGINT dengan melihat output dari
$ kill -l INT
2
$ grep Sig "/proc/$pid/status"
SigQ: 0/63858
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000002
SigCgt: 0000000000000000
SIGINT adalah 2. Bit kedua SigIgn di atas adalah 1, yang berarti SIGINT diabaikan.
Anda dapat mengotomatiskannya dengan:
$ SIG=$(kill -l INT) perl -lane 'print $1 if $F[0] =~ /^Sig(...):/ &&
$F[1] & (1<<($ENV{SIG}-1))' < "/proc/$pid/status"
Ign
Untuk memeriksa apa intr
karakter saat ini atau jika isig
diaktifkan untuk terminal yang diberikan:
$ stty -a < /dev/pts/0
[...] intr = ^C [...] isig
(di atas intr
karakter adalah ^C
(karakter yang biasanya dikirim oleh terminal Anda (emulator) ketika menekan CTRL-Cdan sinyal input tidak dinonaktifkan.
$ stty -a < /dev/pts/1
[...] intr = ^K [...] -isig
( intr
karakter adalah ^K
dan isig
dinonaktifkan untuk /dev/pts/1
).
Untuk kelengkapan, ada dua cara lain proses dapat melakukan sesuatu untuk berhenti menerima SIGINT meskipun itu bukan sesuatu yang biasanya Anda lihat.
Setelah itu Ctrl+C, sinyal SIGINT dikirim ke semua proses dalam kelompok proses latar depan terminal . Biasanya shell yang menempatkan proses dalam kelompok proses (dipetakan ke pekerjaan shell ) dan memberi tahu perangkat terminal yang merupakan yang paling depan .
Sekarang sebuah proses bisa:
Tinggalkan grup prosesnya. Jika pindah ke grup proses lain (grup proses mana pun kecuali yang merupakan latar depan ), maka ia tidak akan lagi menerima SIGINT pada Ctrl-C(atau sinyal terkait keyboard lainnya seperti SIGTSTP, SIGQUIT). Namun bisa ditangguhkan jika mencoba membaca (mungkin menulis juga tergantung pada pengaturan perangkat terminal) dari perangkat terminal (seperti proses latar belakang lakukan).
Sebagai contoh:
perl -MPOSIX -e 'setpgid(0,getppid) or die "$!"; sleep 10'
tidak dapat diganggu dengan Ctrl-C. Di atas perl
akan mencoba untuk bergabung dengan grup proses yang ID-nya sama dengan ID proses induknya. Secara umum, tidak ada jaminan bahwa ada grup proses dengan id itu. Tetapi di sini, dalam kasus perl
perintah dijalankan sendiri pada prompt shell interaktif, ppid akan menjadi proses shell dan shell biasanya sudah dimulai dalam grup prosesnya sendiri.
Jika perintah belum menjadi pemimpin grup proses (pemimpin grup proses latar depan), maka memulai grup proses baru akan memiliki efek yang sama.
Misalnya, tergantung pada shell,
$ ps -j >&2 | perl -MPOSIX -e 'setpgid(0,0) or die "$!"; sleep 10'
PID PGID SID TTY TIME CMD
21435 21435 21435 pts/12 00:00:00 zsh
21441 21441 21435 pts/12 00:00:00 ps
21442 21441 21435 pts/12 00:00:00 perl
akan memiliki efek yang sama. ps
dan perl
dimulai pada grup proses latar depan, tetapi pada kebanyakan shell, ps
akan menjadi pemimpin grup tersebut (seperti yang terlihat pada ps
output di atas di mana pgid keduanya ps
dan perl
merupakan pid ps
), sehingga perl
dapat memulai grup prosesnya sendiri.
Atau bisa mengubah grup proses latar depan. Pada dasarnya beritahu perangkat tty untuk mengirim SIGINT ke beberapa grup proses lainnyaCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) atau mati $!; tidur 5 '
Di sana, perl
tetap berada dalam grup proses yang sama tetapi sebaliknya memberi tahu perangkat terminal bahwa grup proses latar depan adalah ID yang sama dengan ID proses induknya (lihat catatan di atas tentang itu).
kill -9 %
membunuhnya. Sinyal 9 tidak dapat diabaikan, juga tidak dapat menangguhkan sinyal. Urutan keyboard CTRL + Z dapat diabaikan dalam teori - tetapi tidak dalam praktiknya.