@Hvd tarafından verilen cevap temel olarak doğrudur. Bunu daha da yedeklemek için, init
işlem önce SIGTERM
bilgisayarınızı kapattığınızda işlemlere gönderilir , daha sonra SIGKILL
henüz çıkmamışlarsa bir gecikmeden sonra gönderilir. İşlemler işleyemez / yok sayamaz SIGKILL
.
Yine de biraz daha ayrıntı vermek gerekirse, asıl cevap, programın onu ele aldığından emin olmanın hiçbir yolu olmadığıdır. SIGTERM
kibarca bir programdan çıkmasını istemek için kullanılan en yaygın sinyaldir, ancak tüm sinyal işleme, sinyalle bir şeyler yapan programa bağlıdır.
Diğer cevaplara dayanarak, farklı bir şekilde ifade etmek gerekirse, @Jos veya @AlexGreg tarafından yazılmış bir programınız olsaydı, muhtemelen ele alıyorlardı, SIGQUIT
ama muhtemelen değillerdi SIGTERM
ve bu nedenleSIGTERM
daha az "yumuşak" olurdu SIGQUIT
.
Bazı kodlar yazdım, böylece onunla oynayabilirsin. Aşağıdakini farklı kaydedin signal-test.c
, ardından derleyin
gcc -o signal-test signal-test.c
Daha sonra onu çalıştırabilir ./signal-test
ve farklı sinyaller gönderdiğinizde ne olacağını görebilirsiniz 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;
}
Durduğu gibi, kod hem SIGTERM hem de SIGQUIT'i zarif bir şekilde işler. Sinyal işleyiciyi kaldırmak için satırları yorumlamayı deneyebilirsiniz signal(SIG...
( //
satırın başında a kullanarak ), ardından çalıştırıp sinyalleri tekrar gönderin. Bu farklı çıktıları görebilmeniz gerekir:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
sinyalleri idare edip etmemenize bağlı olarak.
Sinyalleri görmezden gelmeyi de deneyebilirsiniz:
signal(SIGTERM, SIG_IGN);
Bunu yaparsanız, gönderme SIGTERM
hiçbir şey yapmaz, kullanmanız gerekirSIGKILL
, işlemi sonlandırmak gerekir.
İçinde daha fazla ayrıntı man 7 signal
. Kullanarak unutmayınsignal()
Bu şekilde taşınabilir olmayan olarak kabul edildiğini - yine de alternatiften çok daha kolay!
Solaris ile ilgili bir diğer küçük dipnot killall
tüm süreçleri öldürmeye çalışıyor. Hepsi. Kök olarak çalıştırırsanız şaşırabilirsiniz :)