@Hvd tarafından verilen cevap temel olarak doğrudur. Bunu daha da yedeklemek için, initişlem önce SIGTERMbilgisayarınızı kapattığınızda işlemlere gönderilir , daha sonra SIGKILLhenü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. SIGTERMkibarca 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ı, SIGQUITama muhtemelen değillerdi SIGTERMve 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-testve 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 SIGTERMhiç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 killalltüm süreçleri öldürmeye çalışıyor. Hepsi. Kök olarak çalıştırırsanız şaşırabilirsiniz :)