@Hvd का उत्तर मूल रूप से सही है। इसे और भी अधिक वापस करने के लिए, init
प्रक्रिया पहले प्रक्रियाओं को भेज देगी SIGTERM
जब आपके कंप्यूटर को बंद कर रहे हैं, तो एक देरी के बाद भेज देंगे SIGKILL
यदि वे पहले से ही बाहर नहीं निकले हैं। प्रक्रियाओं को संभाल नहीं सकते / अनदेखा कर सकते हैं SIGKILL
।
हालांकि थोड़ा और विस्तार देने के लिए, वास्तविक उत्तर यह है कि आपके पास यह जानने का कोई तरीका नहीं है कि प्रोग्राम इसे संभालता है। SIGTERM
किसी प्रोग्राम को छोड़ने के लिए विनम्रता से पूछने के लिए उपयोग करने के लिए सबसे सामान्य संकेत है, लेकिन सभी सिग्नल हैंडलिंग प्रोग्राम पर सिग्नल के साथ कुछ करने पर निर्भर करता है।
अन्य उत्तरों के आधार पर इसे अलग तरीके से रखने के लिए, यदि आपके पास @Jos या @AlexGreg द्वारा लिखित एक कार्यक्रम था, तो वे संभवतः संभाल रहे होंगे , SIGQUIT
लेकिन संभवतः नहीं SIGTERM
, और इसलिए भेजने की SIGTERM
तुलना में कम "नरम" होगा SIGQUIT
।
मैंने कुछ कोड लिखे हैं, ताकि आप खुद उसके साथ खेल सकें। नीचे के रूप में सहेजें signal-test.c
, फिर संकलन करें
gcc -o signal-test signal-test.c
फिर आप इसे चला सकते हैं ./signal-test
, और देख सकते हैं कि जब आप अलग-अलग सिग्नल भेजते हैं तो क्या होता है 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;
}
जैसा कि यह खड़ा है, कोड SIGTERM और SIGQUIT दोनों को इनायत से संभालता है। आप सिग्नल हैंडलर को हटाने के लिए लाइनों signal(SIG...
( //
लाइन की शुरुआत में उपयोग करके) पर टिप्पणी करने की कोशिश कर सकते हैं , फिर दौड़ सकते हैं और फिर से सिग्नल भेज सकते हैं। आपको इन विभिन्न आउटपुटों को देखने में सक्षम होना चाहिए:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
आप संकेतों को संभालते हैं या नहीं, इसके आधार पर।
आप संकेतों को अनदेखा करने का भी प्रयास कर सकते हैं:
signal(SIGTERM, SIG_IGN);
यदि आप ऐसा करते हैं तो भेजने SIGTERM
से कुछ नहीं होगा, आपको SIGKILL
प्रक्रिया को समाप्त करने के लिए उपयोग करना होगा।
में अधिक जानकारी के लिए man 7 signal
। ध्यान दें कि signal()
इस तरह से उपयोग करना गैर-पोर्टेबल माना जाता है - हालांकि यह विकल्प की तुलना में बहुत आसान है!
एक अन्य मामूली फुटनोट - सोलारिस पर killall
सभी प्रक्रियाओं को मारने का प्रयास करता है। उन सभी को। यदि आप इसे जड़ के रूप में चलाते हैं तो आप आश्चर्यचकित हो सकते हैं :)