Jawaban oleh @hvd pada dasarnya benar. Untuk mendukung hal itu lebih jauh lagi, init
proses akan mengirim SIGTERM
ke proses saat Anda mematikan komputer Anda, kemudian setelah penundaan akan mengirim SIGKILL
jika mereka belum keluar. Proses tidak dapat menangani / mengabaikan SIGKILL
.
Untuk memberikan sedikit lebih detail, jawaban sebenarnya adalah bahwa Anda tidak memiliki cara untuk mengetahui dengan pasti bahwa program menanganinya. SIGTERM
adalah sinyal yang paling umum digunakan untuk sopan meminta suatu program untuk berhenti, tetapi semua penanganan sinyal tergantung pada program melakukan sesuatu dengan sinyal.
Dengan kata lain, berdasarkan jawaban yang lain, jika Anda memiliki program yang ditulis oleh @ Jo atau oleh @AlexGreg maka mereka mungkin akan menangani SIGQUIT
tetapi mungkin tidak SIGTERM
, dan karenanya mengirim SIGTERM
akan menjadi kurang "lunak" daripada SIGQUIT
.
Saya telah menulis beberapa kode sehingga Anda dapat bermain-main dengannya sendiri. Simpan di bawah ini sebagai signal-test.c
, lalu kompilasi dengan
gcc -o signal-test signal-test.c
Anda kemudian dapat menjalankannya ./signal-test
, dan melihat apa yang terjadi ketika Anda mengirim sinyal yang berbeda dengannya killall -s <signal>
.
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag = 0;
void handle_signal(int s)
{
flag = s;
}
int main(int argc, char *argv[])
{
signal(SIGTERM, handle_signal);
signal(SIGQUIT, handle_signal);
while(flag == 0){
sleep(1);
}
printf("flag is %d\n", flag);
return flag;
}
Seperti berdiri, kode menangani SIGTERM dan SIGQUIT dengan anggun. Anda dapat mencoba mengomentari garis signal(SIG...
(menggunakan a //
di awal baris) untuk menghapus penangan sinyal, kemudian jalankan dan mengirim sinyal lagi. Anda harus dapat melihat output yang berbeda ini:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
tergantung pada apakah Anda menangani sinyal atau tidak.
Anda juga dapat mencoba mengabaikan sinyal:
signal(SIGTERM, SIG_IGN);
Jika Anda melakukannya maka pengiriman SIGTERM
tidak akan melakukan apa pun, Anda harus menggunakannya SIGKILL
untuk mengakhiri proses.
Lebih detail di man 7 signal
. Perhatikan bahwa menggunakan signal()
cara ini dianggap non-portabel - jauh lebih mudah daripada alternatifnya!
Satu catatan kaki kecil lainnya - tentang Solaris killall
mencoba untuk membunuh semua proses. Mereka semua. Jika Anda menjalankannya sebagai root maka Anda mungkin akan terkejut :)