C Academy · पाठ

Signals

Asynchronous notifications

पाठ 4, कुल 4 में से13 चरण

Signals, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Signal क्या है

Signal किसी प्रक्रिया को भेजी जाने वाली एक असमकालिक सूचना है, जो बताती है कि कोई घटना हुई है, जैसे उपयोगकर्ता ने Ctrl-C दबाया हो या child प्रक्रिया समाप्त हुई हो। Signals IPC का हल्का रूप हैं।

सामान्य Signals

कुछ signals जिनसे आपका अक्सर सामना होगा:

  • SIGINT interruption (Ctrl-C)
  • SIGTERM शिष्टतापूर्ण समाप्ति अनुरोध
  • SIGKILL बलपूर्वक समाप्त करना (जिसे पकड़ा नहीं जा सकता)
  • SIGCHLD child ने अपनी स्थिति बदली
  • SIGSEGV अमान्य memory access

डिफ़ॉल्ट कार्रवाइयाँ

हर सिग्नल की एक डिफ़ॉल्ट कार्रवाई होती है: समाप्त करना, कोर डंप के साथ समाप्त करना, अनदेखा करना, रोकना या जारी रखना। आप इनमें से अधिकांश को handler से बदल सकते हैं।

handler स्थापित करना

handler सेट करने का आधुनिक और पोर्टेबल तरीका sigaction है। handler एक ऐसा फ़ंक्शन होता है जो सिग्नल संख्या लेता है।

#include <signal.h>
#include <stdio.h>

void on_signal(int sig) {
    /* note: printf is not async-signal-safe; for demo only */
    write(1, "caught\n", 7);
}

int install(void) {
    struct sigaction sa = {0};
    sa.sa_handler = on_signal;
    return sigaction(SIGINT, &sa, NULL);
}

signal() का उपयोग क्यों नहीं

पुराने signal() फ़ंक्शन का व्यवहार अलग-अलग सिस्टमों पर एक जैसा नहीं होता (handler रीसेट हो जाता है और SA_RESTART नियंत्रण उपलब्ध नहीं होता)। sigaction का उपयोग करना बेहतर है, क्योंकि उसका व्यवहार स्पष्ट रूप से परिभाषित और पोर्टेबल है।

असमकालिक सिग्नल-सुरक्षित फ़ंक्शन

handler आपके कोड को किसी भी बिंदु पर बाधित कर सकता है, इसलिए वह केवल असमकालिक-सिग्नल-सुरक्षित फ़ंक्शन, जैसे write, ही कॉल कर सकता है। handler से printf या malloc कॉल करने पर डेडलॉक या डेटा-क्षति का जोखिम रहता है।

volatile फ़्लैग का उपयोग

एक सुरक्षित तरीका यह है: handler एक volatile sig_atomic_t फ़्लैग सेट करता है और मुख्य लूप उसे जाँचता है। इससे handler छोटा और सुरक्षित रहता है।

#include <signal.h>

volatile sig_atomic_t stop = 0;

void handler(int sig) {
    stop = 1; /* only set a flag */
}
/* main loop: while (!stop) { do_work(); } */

सिग्नल भेजना

किसी दूसरी प्रक्रिया को सिग्नल भेजने के लिए kill(pid, sig) या स्वयं को सिग्नल भेजने के लिए raise(sig) का उपयोग करें। नाम के बावजूद, kill केवल घातक सिग्नल नहीं, बल्कि कोई भी सिग्नल भेजता है।

#include <signal.h>

int notify(int pid) {
    return kill(pid, SIGTERM); /* ask process to terminate */
}

सिग्नल रोकना

किसी महत्वपूर्ण खंड की सुरक्षा के लिए sigprocmask और सिग्नल सेट की सहायता से सिग्नलों को अस्थायी रूप से रोकें। रोके गए सिग्नल लंबित रहते हैं और रोक हटाते ही डिलीवर कर दिए जाते हैं।

#include <signal.h>

void block_int(void) {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, NULL);
}

SIGCHLD के साथ चाइल्ड प्रक्रियाओं को रीप करना

जब कोई चाइल्ड प्रक्रिया समाप्त होती है, तो कर्नेल SIGCHLD भेजता है। waitpid कॉल करने वाला handler चाइल्ड प्रक्रिया को रीप करता है और प्रक्रिया तालिका में लंबे समय तक बने रहने वाली ज़ॉम्बी प्रक्रियाओं को रोकता है।

#include <signal.h>
#include <sys/wait.h>

void reap(int sig) {
    while (waitpid(-1, NULL, WNOHANG) > 0)
        ; /* reap all finished children */
}

वे सिग्नल जिन्हें पकड़ा नहीं जा सकता

दो सिग्नल पूर्णतः अपरिवर्तनीय हैं: SIGKILL हमेशा प्रक्रिया समाप्त करता है और SIGSTOP हमेशा प्रक्रिया रोकता है। उन्हें पकड़ा, रोका या अनदेखा नहीं किया जा सकता; इससे सिस्टम को प्रक्रियाओं को नियंत्रित करने का एक सुनिश्चित तरीका मिलता है।

त्वरित जाँच

सिग्नलों की अपनी समझ जाँचें।

पुनरावलोकन

आपने असमकालिक सूचनाओं के लिए सिग्नलों के बारे में सीखा।

  • पुराने signal की जगह sigaction से handler स्थापित करें
  • handler असमकालिक-सिग्नल-सुरक्षित होने चाहिए; फ़्लैग सेट करना बेहतर है
  • kill/raise से भेजें और sigprocmask से रोकें
  • SIGCHLD पर चाइल्ड प्रक्रियाओं को रीप करें; SIGKILL और SIGSTOP को पकड़ा नहीं जा सकता
शुरुआत निःशुल्क

एआई शिक्षक के साथ C सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
39
पाठ
144

अक्सर पूछे जाने वाले प्रश्न

क्या “Signals” पाठ निःशुल्क है?

हाँ—“Signals” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Signals” में मैं क्या सीखूँगा?

Asynchronous notifications आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“Signals” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Pipes
  2. Shared Memory
  3. Message Queues
  4. Signals
← C Academy पर वापस जाएँ