सिगनेशन और सिग्नल में क्या अंतर है?


143

मैं एक ऐप में एक अतिरिक्त सिग्नल हैंडलर जोड़ने वाला था जिसे हमने यहां देखा है और मैंने देखा कि लेखक ने sigaction()अन्य सिग्नल हैंडलर स्थापित करने के लिए उपयोग किया था । मैं उपयोग करने जा रहा था signal()। कन्वेंशन का पालन करने के लिए मुझे उपयोग करना चाहिए sigaction()लेकिन अगर मैं स्क्रैच से लिख रहा हूं, तो मुझे क्या चुनना चाहिए?

जवाबों:


167

sigaction()जब तक आपको ऐसा न करने के लिए बहुत मजबूर कारण मिलें, तब तक उपयोग करें ।

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

  1. signal()समारोह नहीं (जरूरी) अन्य संकेतों पहुंचने जबकि वर्तमान हैंडलर निष्पादित हो रहा है से ब्लॉक करता है; sigaction()वर्तमान हैंडलर के वापस आने तक अन्य संकेतों को ब्लॉक कर सकते हैं।
  2. signal()समारोह (आमतौर पर) के लिए संकेत कार्रवाई वापस रीसेट करता है SIG_DFLलगभग सभी संकेतों के लिए (डिफ़ॉल्ट)। इसका मतलब यह है किsignal() हैंडलर को अपनी पहली कार्रवाई के रूप में खुद को फिर से स्थापित करना होगा। यह उस समय के बीच भेद्यता की एक खिड़की भी खोलता है जब सिग्नल का पता लगाया जाता है और हैंडलर को फिर से इंस्टॉल किया जाता है, जिसके दौरान यदि सिग्नल का दूसरा उदाहरण आता है, तो डिफ़ॉल्ट व्यवहार (आमतौर पर समाप्त हो जाता है, कभी-कभी पूर्वाग्रह के साथ - उर्फ ​​कोर डंप) होता है।
  3. signal()सिस्टम और मानकों के बीच भिन्नता का सटीक व्यवहार उन विविधताओं को अनुमति देता है।

sigaction()इसके बजाय आमतौर पर उपयोग करने के लिए अच्छे कारण हैं signal()। हालांकि, का इंटरफ़ेस sigaction()निर्विवाद रूप से अधिक काल्पनिक है।

दोनों में से जो भी आप उपयोग करते हैं, वैकल्पिक सिग्नल इंटरफेस जैसे , और sighold(), से लुभाएं नहीं । वे नाममात्र के विकल्प हैं , लेकिन वे केवल बमुश्किल मानकीकृत हैं और गंभीर उपयोग के बजाय पश्चगामी संगतता के लिए POSIX में मौजूद हैं। ध्यान दें कि पोसिक्स मानक कहता है कि बहु-थ्रेडेड कार्यक्रमों में उनका व्यवहार अपरिभाषित है।sigignore()sigpause()sigrelse()sigaction()

बहु-थ्रेडेड प्रोग्राम और सिग्नल एक पूरी अन्य जटिल कहानी है। AFAIK, दोनों signal()और sigaction()मल्टी-थ्रेडेड अनुप्रयोगों में ठीक हैं।

कॉर्नस्टाल्स अवलोकन :

लिनक्स मैन पेज signal()कहता है:

  signal()एक बहु-थ्रेडेड प्रक्रिया के प्रभाव अनिर्दिष्ट हैं।

इस प्रकार, मुझे लगता sigaction()है कि एकमात्र ऐसा है जिसे बहु-थ्रेडेड प्रक्रिया में सुरक्षित रूप से उपयोग किया जा सकता है।

यह तो दिलचस्प है। लिनक्स मैनुअल पेज इस मामले में POSIX से अधिक प्रतिबंधात्मक है। POSIX इसके लिए निर्दिष्ट करता है signal():

यदि प्रक्रिया बहु-थ्रेडेड है, या यदि प्रक्रिया एकल-थ्रेडेड है और एक सिग्नल हैंडलर को परिणाम के अलावा अन्य द्वारा निष्पादित किया जाता है:

  • प्रक्रिया बुला abort(), raise(), kill(), pthread_kill(), या sigqueue()एक संकेत है कि अवरुद्ध नहीं कर रहा है उत्पन्न करने के लिए
  • एक लंबित सिग्नल को अनब्लॉक किया जा रहा है और उस कॉल से पहले डिलीवर किया जा रहा है जो इसे वापस करता है

व्यवहार अनिर्धारित है यदि सिग्नल हैंडलर errnoस्थिर वस्तु की अवधि के अलावा किसी वस्तु को संदर्भित करता है volatile sig_atomic_t, जैसा कि घोषित वस्तु के मूल्य को निर्दिष्ट करने के अलावा , या यदि सिग्नल हैंडलर इस मानक में परिभाषित किसी भी फ़ंक्शन को सूचीबद्ध कार्यों के अलावा किसी अन्य फ़ंक्शन को कॉल करता है। सिग्नल अवधारणाओं

तो पोसिक्स स्पष्ट रूप signal()से एक बहु-थ्रेडेड अनुप्रयोग के व्यवहार को निर्दिष्ट करता है ।

फिर भी, sigaction()अनिवार्य रूप से सभी परिस्थितियों में पसंद किया जाना चाहिए - और पोर्टेबल बहु-थ्रेडेड कोड का उपयोग sigaction()तब तक करना चाहिए जब तक कि एक भारी कारण न हो कि यह क्यों नहीं हो सकता है (जैसे "केवल मानक सी द्वारा परिभाषित फ़ंक्शन का उपयोग करें" - और हां, C11 कोड बहु हो सकता है -threaded)। जो मूल रूप से इस उत्तर का शुरुआती पैराग्राफ भी कहता है।


12
यह वर्णन signalवास्तव में यूनिक्स सिस्टम V व्यवहार का है। POSIX या तो इस व्यवहार या बहुत अधिक बीएसएनडी व्यवहार की अनुमति देता है, लेकिन चूंकि आप यह सुनिश्चित नहीं कर सकते कि आपको कौन सा मिलेगा, यह अभी भी उपयोग करना सबसे अच्छा है sigaction
आर .. गिटहब स्टॉप हेल्पिंग ICE

1
जब तक आप स्पष्ट रूप से पुराने सिग्नल () व्यवहार का अनुकरण करने की अनुमति देने के लिए स्पष्ट रूप से सिगनेशन () में जोड़े गए झंडे का उपयोग नहीं करते हैं। क्या झंडे होंगे (विशिष्ट रूप से)?
क्रिश्चियनक्यूवास

@AlexFritz: मुख्य रूप से SA_RESETHAND, भी SA_NODEFER
जोनाथन लेफलर

2
@BulatM। यदि आप उपयोग नहीं कर सकते हैं sigaction(), तो आप अनिवार्य रूप से के लिए मानक सी विनिर्देश का उपयोग करने के लिए बाध्य हैं signal()। हालाँकि, यह आपको विकल्पों का एक बेहद कमजोर सेट देता है कि आप क्या कर सकते हैं। आप कर सकते हैं: प्रकार की संशोधित (फ़ाइल स्कोप) चर volatile sig_atomic_t; 'त्वरित निकास' कार्यों ( _Exit(), quick_exit()) या में से एक को बुलाओ abort(); signal()सिग्नल के तर्क के रूप में वर्तमान सिग्नल नंबर के साथ कॉल करें ; वापसी। और बस। कुछ भी पोर्टेबल होने की गारंटी नहीं है। यह इतना कठोर है कि अधिकांश लोग उन नियमों को अनदेखा करते हैं - लेकिन परिणामी कोड डोडी है।
जोनाथन लेफलर

1
sigaction()स्वयं GCC से उत्कृष्ट डेमो: gnu.org/software/libc/manual/html_node/… ; और signal()स्वयं GCC से उत्कृष्ट डेमो: gnu.org/software/libc/manual/html_node/… । ध्यान दें कि signalडेमो में वे हैंडलर को इग्नोर करने ( SIG_IGN) से बदलने से बचते हैं, अगर ऐसा पहले से जानबूझकर सेट किया गया था।
गेब्रियल स्टेपल्स

8

मेरे लिए, यह नीचे की रेखा तय करने के लिए पर्याप्त थी:

सिगनेशन () फ़ंक्शन संकेतों को नियंत्रित करने के लिए एक अधिक व्यापक और विश्वसनीय तंत्र प्रदान करता है; नए अनुप्रयोगों को संकेत () के बजाय सिगनेशन () का उपयोग करना चाहिए

http://pubs.opengroup.org/onlinepubs/009695399/functions/signal.html#tag_03_690_07

चाहे आप स्क्रैच से शुरू कर रहे हों या किसी पुराने प्रोग्राम को संशोधित कर रहे हों, सिगनेशन सही विकल्प होना चाहिए।


5

वे OS की सिग्नल सुविधाओं के लिए अलग इंटरफेस हैं। यदि संभव हो तो सिग्नल का उपयोग करने के लिए सिगनेशन का उपयोग करना चाहिए () में कार्यान्वयन-परिभाषित (अक्सर दौड़ प्रवण) व्यवहार होता है और विंडोज, ओएस एक्स, लिनक्स और अन्य यूनिक्स प्रणालियों पर अलग तरह से व्यवहार करता है।

विवरण के लिए यह सुरक्षा नोट देखें।


1
मैंने सिर्फ glibc सोर्स कोड और सिग्नल () को सिगनेशन () में देखा। यह भी देखें कि मैकओएस मैन पेज कहां दावा करता है।
bmdhacks

जानकर खुशी हुई। मैंने केवल सिग्नल हैंडलर को बाहर निकलने से पहले चीजों को बड़े करीने से देखा है इसलिए मैं आमतौर पर हैंडलर को पुनः स्थापित करने के लिए व्यवहार पर निर्भर नहीं रहूंगा।
मैथ्यू स्मिथ

5

संकेत () मानक C है, sigaction () नहीं है।

यदि आप (या तो आप POSIX सिस्टम पर हैं) का उपयोग करने में सक्षम हैं, तो सिगनेशन () का उपयोग करें; यह अनिर्दिष्ट है कि क्या सिग्नल () हैंडलर को रीसेट करता है, जिसका अर्थ है कि पोर्टेबल होने के लिए आपको हैंडलर के अंदर सिग्नल () को फिर से कॉल करना होगा। इससे भी बुरी बात यह है कि एक दौड़ है: यदि आपको त्वरित उत्तराधिकार में दो संकेत मिलते हैं, और दूसरे को वितरित किया जाता है इससे पहले कि आप हैंडलर को फिर से स्थापित करें, आपके पास डिफ़ॉल्ट कार्रवाई होगी, जो संभवतः आपकी प्रक्रिया को मारने वाली है। दूसरी ओर sigaction () , "विश्वसनीय" सिग्नल शब्दार्थ का उपयोग करने की गारंटी है। आपको हैंडलर को फिर से स्थापित करने की आवश्यकता नहीं है, क्योंकि यह कभी भी रीसेट नहीं होगा। SA_RESTART के साथ, आप स्वचालित रूप से पुनः आरंभ करने के लिए कुछ सिस्टम कॉल भी प्राप्त कर सकते हैं (इसलिए आपको मैन्युअल रूप से EINTR की जांच नहीं करनी होगी)। sigaction () अधिक विकल्प हैं और विश्वसनीय है, इसलिए इसके उपयोग को प्रोत्साहित किया जाता है।

Psst ... किसी को यह न बताएं कि मैंने आपको यह बताया था, लेकिन POSIX में वर्तमान में एक फ़ंक्शन bsd_signal () है जो सिग्नल की तरह कार्य करता है () है, लेकिन BSD शब्दार्थ देता है, जिसका अर्थ है कि यह विश्वसनीय है। इसका मुख्य उपयोग पुराने अनुप्रयोगों को पोर्ट करने के लिए है जो विश्वसनीय संकेतों को मानते हैं, और POSIX इसका उपयोग करने की अनुशंसा नहीं करता है।


POSIX में एक फ़ंक्शन नहीं है bsd_signal()- कुछ POSIX कार्यान्वयन में फ़ंक्शन हो सकता है, लेकिन POSIX में स्वयं ऐसा फ़ंक्शन नहीं होता है ( POSIX देखें )।
जोनाथन लेफलर

4

संक्षेप में:

sigaction()अच्छा और अच्छी तरह से परिभाषित है, लेकिन एक लिनक्स फ़ंक्शन है और इसलिए यह केवल लिनक्स पर काम करता है। signal()खराब और खराब-परिभाषित है, लेकिन एक सी मानक कार्य है और इसलिए यह किसी भी चीज पर काम करता है।

इसके बारे में लिनक्स मैन पेजों का क्या कहना है?

man 2 signal(इसे यहां ऑनलाइन देखें ) में कहा गया है:

संकेत का व्यवहार () UNIX संस्करणों में भिन्न होता है, और लिनक्स के विभिन्न संस्करणों में ऐतिहासिक रूप से भिन्न होता है। इसके उपयोग से बचें: sigaction(2)इसके बजाय उपयोग करें । नीचे पोर्टेबिलिटी देखें।

पोर्टेबिलिटी सिग्नल का केवल पोर्टेबल उपयोग () SIG_DFL या SIG_IGN को सिग्नल के स्वभाव को सेट करना है। सिग्नल हैंडलर स्थापित करने के लिए सिग्नल () का उपयोग करते समय शब्दार्थ पूरे सिस्टम में भिन्न होता है (और POSIX.1 स्पष्ट रूप से इस भिन्नता को अनुमति देता है); इस उद्देश्य के लिए इसका उपयोग न करें।

दूसरे शब्दों में: उपयोग न करें signal()sigaction()इसके बजाय का उपयोग करें !

जीसीसी क्या सोचता है?

संगतता नोट: जैसा कि ऊपर कहा गया है signal, इस फ़ंक्शन को संभव होने पर टाला जाना चाहिए। sigactionपसंदीदा तरीका है।

स्रोत: https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html#Basic-Signal-Handling

इसलिए, यदि लिनक्स और जीसीसी दोनों का उपयोग नहीं करने के लिए कहा जाता है signal(), लेकिन sigaction()इसके बजाय इसका उपयोग करने के लिए, यह सवाल उठता है: हम इस भ्रामक sigaction()चीज का उपयोग कैसे करते हैं !?

उपयोग के उदाहरण:

जीसीसी के उत्कृष्ट signal()उदाहरण यहां पढ़ें : https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html#Basic-Signal-Handling

और उनके उत्कृष्ट sigaction()उदाहरण यहाँ: https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html

उन पृष्ठों को पढ़ने के बाद, मैं निम्नलिखित तकनीक लेकर आया sigaction():

1. sigaction(), चूंकि यह एक संकेत हैंडलर संलग्न करने का सही तरीका है, जैसा कि ऊपर वर्णित है:

#include <errno.h>  // errno
#include <signal.h> // sigaction()
#include <stdio.h>  // printf()
#include <string.h> // strerror()

#define LOG_LOCATION __FILE__, __LINE__, __func__ // Format: const char *, unsigned int, const char *
#define LOG_FORMAT_STR "file: %s, line: %u, func: %s: "

/// @brief      Callback function to handle termination signals, such as Ctrl + C
/// @param[in]  signal  Signal number of the signal being handled by this callback function
/// @return     None
static void termination_handler(const int signal)
{
    switch (signal)
    {
    case SIGINT:
        printf("\nSIGINT (%i) (Ctrl + C) signal caught.\n", signal);
        break;
    case SIGTERM:
        printf("\nSIGTERM (%i) (default `kill` or `killall`) signal caught.\n", signal);
        break;
    case SIGHUP:
        printf("\nSIGHUP (%i) (\"hang-up\") signal caught.\n", signal);
        break;
    default:
        printf("\nUnk signal (%i) caught.\n", signal);
        break;
    }

    // DO PROGRAM CLEANUP HERE, such as freeing memory, closing files, etc.


    exit(signal);
}

/// @brief      Set a new signal handler action for a given signal
/// @details    Only update the signals with our custom handler if they are NOT set to "signal ignore" (`SIG_IGN`),
///             which means they are currently intentionally ignored. GCC recommends this "because non-job-control
///             shells often ignore certain signals when starting children, and it is important for children
///             to respect this." See
///             https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html#Basic-Signal-Handling
///             and https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html.
///             Note that termination signals can be found here:
///             https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html#Termination-Signals
/// @param[in]  signal  Signal to set to this action
/// @param[in]  action  Pointer to sigaction struct, including the callback function inside it, to attach to this signal
/// @return     None
static inline void set_sigaction(int signal, const struct sigaction *action)
{
    struct sigaction old_action;

    // check current signal handler action to see if it's set to SIGNAL IGNORE
    sigaction(signal, NULL, &old_action);
    if (old_action.sa_handler != SIG_IGN)
    {
        // set new signal handler action to what we want
        int ret_code = sigaction(signal, action, NULL);
        if (ret_code == -1)
        {
            printf(LOG_FORMAT_STR "sigaction failed when setting signal to %i;\n"
                   "  errno = %i: %s\n", LOG_LOCATION, signal, errno, strerror(errno));
        }
    }
}

int main(int argc, char *argv[])
{
    //...

    // Register callbacks to handle kill signals; prefer the Linux function `sigaction()` over the C function
    // `signal()`: "It is better to use sigaction if it is available since the results are much more reliable."
    // Source: https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html#Basic-Signal-Handling
    // and /programming/231912/what-is-the-difference-between-sigaction-and-signal/232711#232711.
    // See here for official gcc `sigaction()` demo, which this code is modeled after:
    // https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html

    // Set up the structure to specify the new action, per GCC's demo.
    struct sigaction new_action;
    new_action.sa_handler = termination_handler; // set callback function
    sigemptyset(&new_action.sa_mask);
    new_action.sa_flags = 0;

    // SIGINT: ie: Ctrl + C kill signal
    set_sigaction(SIGINT, &new_action);
    // SIGTERM: termination signal--the default generated by `kill` and `killall`
    set_sigaction(SIGTERM, &new_action);
    // SIGHUP: "hang-up" signal due to lost connection
    set_sigaction(SIGHUP, &new_action);

    //...
}

2. और signal(), भले ही इसके लिए सिग्नल हैंडलर संलग्न करने का एक अच्छा तरीका नहीं है, जैसा कि ऊपर वर्णित है, यह जानना अभी भी अच्छा है कि इसका उपयोग कैसे किया जाए।

यहां GCC प्रदर्शन कोड कॉपी-पेस्ट किया गया है, क्योंकि यह जितना अच्छा है उतना ही अच्छा है:

#include <signal.h>

void
termination_handler (int signum)
{
  struct temp_file *p;

  for (p = temp_file_list; p; p = p->next)
    unlink (p->name);
}

int
main (void)
{
  
  if (signal (SIGINT, termination_handler) == SIG_IGN)
    signal (SIGINT, SIG_IGN);
  if (signal (SIGHUP, termination_handler) == SIG_IGN)
    signal (SIGHUP, SIG_IGN);
  if (signal (SIGTERM, termination_handler) == SIG_IGN)
    signal (SIGTERM, SIG_IGN);
  
}

के बारे में पता करने के लिए मुख्य लिंक:

  1. मानक संकेत: https://www.gnu.org/software/libc/manual/html_node/Standard-Signals.html#Standard-Signals
    1. समाप्ति संकेत: https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html#Termination-Signals
  2. मूल सिग्नल हैंडलिंग, आधिकारिक GCC signal()उपयोग उदाहरण सहित : https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html#Basic-Signal-Handling
  3. आधिकारिक जीसीसी sigaction()उपयोग उदाहरण: https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html
  4. सिग्नल सेट, सहित sigemptyset()और sigfillset(); मुझे अभी भी ये ठीक से समझ नहीं आया है, लेकिन जानते हैं कि वे महत्वपूर्ण हैं: https://www.gnu.org/software/libc/manual/html_node/Signal-Sets.html

यह सभी देखें:

  1. TutorialsPoint C ++ सिग्नल हैंडलिंग [उत्कृष्ट डेमो कोड के साथ]: https://www.tutorialspoint.com/cplusplus/cpp_signal_handling.htm
  2. https://www.tutorialspoint.com/c_standard_library/signal_h.htm

2

से signal(3)आदमी पेज:

विवरण

 This signal() facility is a simplified interface to the more
 general sigaction(2) facility.

दोनों एक ही अंतर्निहित सुविधा का आह्वान करते हैं। आप संभवतः दोनों के साथ एक एकल संकेत प्रतिक्रिया में हेरफेर नहीं करना चाहिए, लेकिन उन्हें मिश्रण कुछ भी तोड़ने का कारण नहीं होना चाहिए ...


वह मेरे मैन पेज में नहीं है! मेरे पास "DESCRIPTION सिग्नल () सिस्टम कॉल है, जो नंबर साइनम के साथ सिग्नल के लिए एक नया सिग्नल हैंडलर स्थापित करता है।" मुझे उपयोगी मैन पेज पैकेज में अपग्रेड करने की आवश्यकता है ।
मैथ्यू स्मिथ

1
यह Mac OS X 10.5 पृष्ठों से दूर है।
dmckee --- पूर्व-संचालक ने

ग्लिबक के स्रोत कोड से भी सत्यापित किया गया। संकेत () सिर्फ कॉल sigaction ()
bmdhacks

2
यह संकेत के सभी कार्यान्वयन पर सच नहीं है, हालांकि। यदि आप "व्यवहार" व्यवहार को अनिवार्य बनाना चाहते हैं, तो इस धारणा पर भरोसा न करें।
बेन बर्न्स

1

मैं संकेत पर भी सिगनेशन () का उपयोग करने का सुझाव दूंगा और एक और बिंदु जोड़ना चाहूंगा। sigaction () आपको अधिक विकल्प प्रदान करता है जैसे कि प्रक्रिया की पीडा जो मर गई (siginfo_t संरचना का उपयोग करके संभव है)।


0

मैं सिग्नल का उपयोग करता हूं () क्योंकि यह अधिक पोर्टेबल है, सिद्धांत में कम से कम। मैं किसी भी टिप्पणीकार को वोट दूंगा जो एक आधुनिक प्रणाली के साथ आ सकता है जिसमें POSIX संगतता परत नहीं है और संकेत () का समर्थन करता है।

GLIBC प्रलेखन से उद्धरण :

एक ही कार्यक्रम के भीतर सिग्नल और सिगनेशन फंक्शन दोनों का उपयोग करना संभव है, लेकिन आपको सावधान रहना होगा क्योंकि वे थोड़े अजीब तरीके से बातचीत कर सकते हैं।

सिगनेशन फ़ंक्शन सिग्नल फ़ंक्शन की तुलना में अधिक जानकारी निर्दिष्ट करता है, इसलिए सिग्नल से वापसी मूल्य सिगनेशन संभावनाओं की पूरी श्रृंखला को व्यक्त नहीं कर सकता है। इसलिए, यदि आप किसी कार्रवाई को बचाने के लिए सिग्नल का उपयोग करते हैं और बाद में किसी कार्रवाई को पुन: स्थापित करते हैं, तो यह ठीक से हैंडलर को पुन: स्थापित करने में सक्षम नहीं हो सकता है जिसे शिथिलता से स्थापित किया गया था।

परिणामस्वरूप समस्याओं से बचने के लिए, यदि आपके प्रोग्राम में बिल्कुल भी शिथिलता का उपयोग किया जाता है, तो एक हैंडलर को बचाने और पुनर्स्थापित करने के लिए हमेशा सिगनेशन का उपयोग करें। चूंकि शिथिलता अधिक सामान्य है, यह किसी भी कार्रवाई को ठीक से बचा सकता है और पुन: स्थापित कर सकता है, भले ही यह मूल रूप से संकेत या शिथिलता के साथ स्थापित किया गया हो।

कुछ प्रणालियों पर यदि आप सिग्नल के साथ कोई क्रिया स्थापित करते हैं और फिर उसे शिथिलता के साथ जांचते हैं, तो आपको जो हैंडलर पता मिलता है वह वैसा नहीं हो सकता जैसा आपने सिग्नल के साथ निर्दिष्ट किया था। यह सिग्नल के साथ कार्रवाई तर्क के रूप में उपयोग के लिए भी उपयुक्त नहीं हो सकता है। लेकिन आप इसे तर्क के तर्क के रूप में उपयोग करने पर भरोसा कर सकते हैं। यह समस्या GNU सिस्टम पर कभी नहीं होती है।

इसलिए, आप किसी एक प्रोग्राम के भीतर लगातार एक या दूसरे तंत्र का उपयोग करने से बेहतर हैं।

पोर्टेबिलिटी नोट: मूल सिग्नल फ़ंक्शन आईएसओ सी की एक विशेषता है, जबकि शिथिलता POSIX.1 मानक का हिस्सा है। यदि आप गैर-पोसिक्स प्रणालियों में पोर्टेबिलिटी के बारे में चिंतित हैं, तो आपको सिग्नल फ़ंक्शन का उपयोग करना चाहिए।

कॉपीराइट (C) 1996-2008 फ्री सॉफ्टवेयर फाउंडेशन, इंक।

जीएनयू फ्री डॉक्यूमेंटेशन लाइसेंस, संस्करण 1.2 या फ्री सॉफ्टवेयर फाउंडेशन द्वारा प्रकाशित किसी भी बाद के संस्करण की शर्तों के तहत इस दस्तावेज़ को कॉपी, वितरित और / या संशोधित करने की अनुमति दी गई है; बिना मोर्चे-कवर ग्रंथों के साथ, और कोई बैक-कवर ग्रंथों के साथ कोई अपरिवर्तनीय अनुभाग नहीं। लाइसेंस की एक प्रति "जीएनयू फ्री डॉक्यूमेंटेशन लाइसेंस" नामक अनुभाग में शामिल है।


0

मैन पेज सिग्नल से (7)

प्रक्रिया-निर्देशित सिग्नल को उन थ्रेड्स में से किसी एक पर वितरित किया जा सकता है, जिसमें वर्तमान में सिग्नल ब्लॉक नहीं है। यदि थ्रेड्स में से एक में सिग्नल अनब्लॉक है, तो कर्नेल एक मनमाना धागा चुनता है जिससे सिग्नल डिलीवर किया जा सके।

और मैं कहूंगा कि यह "मुद्दा" सिग्नल (2) और सिगनेशन (2) के लिए मौजूद है । तो संकेतों और pthreads से सावधान रहें।

... और सिग्नल (2) लिनक्स में ग्लिबिक के नीचे सिगनेशन (2) कहते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.