2010-09-28 4 views
10

में मूल सिग्नल हैंडलिंग यह एक सुंदर मूल परिदृश्य है लेकिन मुझे बहुत उपयोगी संसाधन नहीं मिल रहे हैं। मेरे पास एक सी ++ प्रोग्राम है जो लिनक्स में चल रहा है जो फाइल प्रोसेसिंग करता है। लाइनों को पढ़ता है, विभिन्न परिवर्तन करता है, डेटाबेस में डेटा लिखता है। कुछ चर (डेटाबेस में संग्रहीत) हैं जो प्रसंस्करण को प्रभावित करते हैं जो मैं वर्तमान में प्रत्येक पुनरावृत्ति पर पढ़ रहा हूं क्योंकि मैं यथासंभव अद्यतित होना चाहता हूं, लेकिन थोड़ा सा अंतराल ठीक है। लेकिन वे चर शायद ही कभी बदलते हैं, और समय के साथ पढ़े महंगे होते हैं (एक दिन में 10 मिलियन से अधिक पंक्तियां)। मैं प्रत्येक एन पुनरावृत्तियों को पढ़ने के लिए जगह निकाल सकता हूं या एक चर बदलते समय प्रोग्राम को पुनरारंभ कर सकता हूं, लेकिन वे हैकिश लगते हैं।सी ++

इसके बजाय मैं क्या करना चाहता हूं, यह प्रोग्राम एक SUPUP प्राप्त करते समय चर के पुनरावृत्ति को ट्रिगर करता है। सिग्नल हैंडलिंग के बारे में जो कुछ भी मैं पढ़ रहा हूं वह सी सिग्नल लाइब्रेरी के बारे में बात कर रहा है, जो मुझे यकीन नहीं है कि मेरे प्रोग्राम के वर्गों में कैसे जुड़ना है। बूस्ट सिग्नल लाइब्रेरी ओएस सिग्नल को संभालने के बजाए इंटर-ऑब्जेक्ट संचार के बारे में अधिक प्रतीत होता है।

क्या कोई मदद कर सकता है? ऐसा लगता है कि यह अविश्वसनीय रूप से सरल होना चाहिए, लेकिन मैं सी ++ के साथ बहुत जंगली हूँ।

उत्तर

15

मैं इसे संभाल सकता हूं जैसे आप इसे सी में संभाल सकते हैं। मुझे लगता है कि स्टैंडअलोन सिग्नल हैंडलर फ़ंक्शन होना बिल्कुल ठीक है, क्योंकि आप केवल एक सेमफोर पर पोस्ट कर रहे हैं या एक चर या कुछ ऐसे सेट कर रहे हैं, जो एक और थ्रेड या ऑब्जेक्ट यह निर्धारित करने का निरीक्षण कर सकता है कि उसे सेटिंग्स को फिर से पढ़ने की आवश्यकता है या नहीं।

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

/* or you might use a semaphore to notify a waiting thread */ 
static volatile sig_atomic_t sig_caught = 0; 

void handle_sighup(int signum) 
{ 
    /* in case we registered this handler for multiple signals */ 
    if (signum == SIGHUP) { 
     sig_caught = 1; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    /* you may also prefer sigaction() instead of signal() */ 
    signal(SIGHUP, handle_sighup); 

    while(1) { 
     if (sig_caught) { 
      sig_caught = 0; 
      printf("caught a SIGHUP. I should re-read settings.\n"); 
     } 
    } 

    return 0; 
} 

आप kill -1 `pidof yourapp` का उपयोग करके एक SIGHUP भेजने परीक्षण कर सकते हैं।

+1

ओह दुह। मैं पूरी तरह से इसे खत्म कर रहा था और भूल गया था कि सिग्नल वैरिएबल वे हैं जिन्हें मैं प्रत्यक्ष आमंत्रण के बजाय चाहता हूं। * हेडडेस्क * – KernelM

+4

यदि आप मानक अनुपालन करना चाहते हैं, तो अपने सिग्नल हैंडलर को 'बाहरी "सी'' –

+0

@R सैमुअल के रूप में अर्हता प्राप्त करना सुनिश्चित करें: यह एक अच्छा बिंदु है।मैंने सी 'कोड लिखने के बाद से' बाहरी 'सी' के बारे में भी नहीं सोचा था, लेकिन ओपी को इसकी आवश्यकता होगी! –

1

कई संभावनाएं हैं; यह उन सभी को लागू करने के लिए जरूरी नहीं होगा:

  • सी की तरह एक विशिष्ट सिग्नल का जवाब दें। सी ++ एक ही तरीके से काम करता है। signal() के लिए प्रलेखन देखें।
  • कुछ फ़ाइल बदलने के संशोधित टाइमस्टैम्प पर ट्रिगर, डेटाबेस की तरह अगर यह एक फ्लैट फ़ाइल में संग्रहीत है।
  • प्रति घंटे एक बार ट्रिगर, या प्रति दिन एक बार (जो भी समझ में आता है)।
3

मैं this link की जांच करने की सिफारिश करता हूं जो सिग्नल पंजीकृत करने पर विवरण देता है।

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

+0

वह वेबसाइट बंद दिखती है, इसलिए आप विवरण के लिए [यह लिंक] (http://www.yolinux.com/TUTORIALS/C++Signals.html) देखना चाहेंगे। –

+0

नहीं, cplusplus.com (और वह लिंक) अभी भी मेरे लिए ठीक लग रहा है। हालांकि कई संदर्भ होने के लिए हमेशा अच्छा है। – Bryan

0

आप ओएस सिग्नल से संबंधित बूस्ट सिग्नल को परिभाषित कर सकते हैं और संबंधित हैंडलर को आमंत्रित करने के लिए बूस्ट सिग्नल को अपने स्लॉट में जोड़ सकते हैं।