2013-04-13 4 views
15

मैं सी में पूरी तरह से नोब हूँ। मैं एक समारोह mypause() कि एक कार्यक्षमता pause() सिस्टम कॉल के समान होना चाहिए लिखते हैं, और एक प्रोग्राम है जो सिग्नल की प्रतीक्षा कर बार-बार ब्लॉक में mypause() समारोह का परीक्षण करने के लिए है। te pause() फ़ंक्शन कैसे काम करता है ?? ब्लॉक और एक संकेत के लिए प्रतीक्षा करने के लिए कार्यक्रम के क्रम मेंरोकें() कैसे काम करता है?

fprintf(stderr, "press any key to continue\n"); 

: मैं बस एक mypause() इस तरह से काम नहीं कर सकते हैं?

मन है कि मैंने कभी pause() या sigpause() उपयोग नहीं कर सकते में है।

+0

तो आप एक महत्वपूर्ण स्ट्रोक की प्रतीक्षा करना चाहते हैं? – m0skit0

+1

एक होमवर्क प्रश्न की तरह लगता है। इस तरह टैग किया जाना चाहिए? वैसे भी, मुझे लगता है कि आप जिस समस्या को हल करना चाहते हैं उसे समझ में नहीं आया है। रोक() कॉल उपयोगकर्ता इनपुट के लिए इंतजार नहीं करता है। –

+0

आईई। कुंजीपटल घटनाएं यहां आवश्यक अर्थ में सिग्नल नहीं हैं। –

उत्तर

13

pause() समारोह ब्लॉक जब तक एक संकेत आता है। उपयोगकर्ता इनपुट सिग्नल नहीं हैं। एक सिग्नल किसी अन्य प्रक्रिया या सिस्टम द्वारा उत्सर्जित किया जा सकता है।

उदाहरण के लिए Ctrl-C दबाने, वर्तमान चल रहा है प्रक्रिया है, जो सामान्य मामलों में प्रक्रिया मारे जाने के लिए कारण बनता है के लिए एक SIGINT संकेत भेजने के लिए अपने खोल कारण बनता है।

आदेश आईएसओ C99 में pause के व्यवहार आप निम्नलिखित की तरह कुछ लिख सकता है अनुकरण करने के लिए है। कोड पर टिप्पणी की गई है, अगर आपके पास इस कार्यान्वयन के बारे में कोई सवाल है, तो कृपया पूछें।

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

/** 
* The type sig_atomic_t is used in C99 to guarantee 
* that a variable can be accessed/modified in an atomic way 
* in the case an interruption (reception of a signal for example) happens. 
*/ 
static volatile sig_atomic_t done_waiting = 0; 

static void  handler() 
{ 
    printf("Signal caught\n"); 
    done_waiting = 1; 
} 

void my_pause() 
{ 
    /** 
    * In ISO C, the signal system call is used 
    * to call a specific handler when a specified 
    * signal is received by the current process. 
    * In POSIX.1, it is encouraged to use the sigaction APIs. 
    **/ 
    signal(SIGINT, handler); 
    done_waiting = 0; 
    while (!done_waiting) 
    ; 
} 

int  main() 
{ 
    my_pause(); 
    printf("Hey ! The first call to my_pause returned !\n"); 
    my_pause(); 
    printf("The second call to my_pause returned !\n"); 
    return (0); 
} 

नोट करें कि यह उदाहरण केवल SIGINT सिग्नल के साथ काम करता है। सिग्नल के एक अतिरिक्त सेट को संभालने के लिए, आप अलग-अलग सिग्नल नंबरों के साथ signal() पर अन्य कॉल का उपयोग कर सकते हैं या सभी वांछित संकेतों का संदर्भ देने वाले मुखौटा के साथ sigaction() का उपयोग कर सकते हैं।

एक अपने सिस्टम पर संकेत availables की पूरी सूची पाया जा सकता है में आप <signal.h> शामिल हैं।

+4

व्यस्त-प्रतीक्षा खराब है। उस लूप में नींद रखो। – Dave

+1

(नींद संकेतों के लिए जल्दी उठ जाएगी) – Dave

+1

धन्यवाद हलीम काराउम यह वही है जो मुझे चाहिए। –

संबंधित मुद्दे