मैं एक असाइनमेंट पर काम कर रहा हूं जो सिग्नल के बारे में सीखने के लक्ष्य के साथ दो प्रक्रियाओं के बीच एक द्विआधारी संदेश स्थानांतरित करने के लिए संकेतों का उपयोग करता है (यह वास्तव में एक अजीब उपयोग है)।मेरा सिग्नल हैंडलर क्यों नहीं कहा जा रहा है?
मेरे कार्यक्रम में, दो प्रक्रियाएं एक कोड को संवाद करती हैं, और फिर एक दूसरे को एक संदेश स्थानांतरित करता है। SIGUSR1 0 का प्रतिनिधित्व करता है, SIGUSR2 का प्रतिनिधित्व करता है 1. विचार यह है कि संदेश भेजने की प्रक्रिया में मारने के लिए जो भी सिगसआर संदेश प्राप्त करने के लिए हत्या कार्य का उपयोग करेगा, और प्राप्त करने की प्रक्रिया में कोड की व्याख्या करने के लिए सिग्नल हैंडलर होगा।
तो यहां समस्या है। मेरे पास प्रेषक शुरू हो गया है। यह सोता है जब यह कोड भेजने के लिए इंतजार कर रहा है। प्रेषक प्रेषक के ढक्कन को खोजने के लिए pidof(8)
का उपयोग करके 'पासवर्ड' को इंगित करने के लिए दो SIGINT भेजता है।
प्रेषक के सिग्नल हैंडलर ने इन संकेतों को पढ़ लिया है, यह पहचानता है कि यह उचित पासवर्ड है, फिर यह संदेश भेजने के लिए आगे बढ़ता है।
रिसीवर अब कुछ कार्यों के माध्यम से चला गया है, और प्रत्येक बिट के लिए हर दूसरे इंतजार के लिए हर दूसरे इंतजार कर रहा है। समस्या यह है कि यह कभी नहीं होता है।
मैं इसे स्थापित किया है ऊपर ऐसी है कि इस तरह तो थोड़ा (0 इस मामले में) भेज रहा है:
kill(SIGUSR1,washingtonPID);
जहां washingtonPID रिसीवर की पीआईडी है, और मैं इस को सत्यापित किया है सही है पीआईडी।
रिसीवर के हैंडलर इसलिए की तरह झुका है:
//IN MAIN
signal(SIGINT,bitReceiver);
signal(SIGUSR1,bitReceiver);
signal(SIGUSR2,bitReceiver);
//OUTSIDE MAIN
void bitReceiver(int signum)
{
if(signum == SIGUSR1)
{
fprintf(stderr,"SIGUSR1 - 0");
bit = 0;
}
else if (signum == SIGUSR2)
{
fprintf(stderr,"SIGUSR2 - 1");
bit = 1;
}
else //sigint
raise(SIGINT);
return;
}
जहां बिट एक वैश्विक चर रहा है। यह शुरू में -1 पर सेट है।
int receiveBit()
{
while(bit == -1)
{
sleep(1);
}
fprintf(stderr,"%d",bit);
int bit2 = bit;
bit = -1;
return bit2;
}
तो बुनियादी रन के माध्यम से यह है:: कोड भेजने वाले को रिसीवर से भेज दिया गया है के बाद, इस की मार संकेत भेजने के लिए शुरू होता है
यहाँ समारोह जो बिट्स पढ़ता है यूएसआर 1 और यूएसआर 2 रिसीवर को, जो अंततः एक बाइनरी संदेश बनाना चाहिए।
रिसीवर बस इस बिंदु पर प्रतीक्षा कर रहा है, हर सेकेंड सो रहा है। जब यह बाधित हो जाता है, तो हैंडलर 0 या 1 पर सेट करेगा, इसे नींद से मार देगा, थोड़ा प्रिंट करेगा, और इसे वापस कर देगा।
तो मैं दो कार्यक्रमों सामान्य रूप से चलाने, रिसीवर सिर्फ नींद में बैठता है, और हैंडलर कभी नहीं कहा जाता है (भले ही मैं देख सकता हूँ कॉल अन्य प्रक्रिया द्वारा किया जा रहा है।
तो मैं इस रोक , और मैन्युअल रूप से किल सिग्नल भेजते हैं, मैं एक भेज सकता हूं, शायद दो सिग्नल, दोनों ठीक तरह से संभाले जा सकते हैं। उसके बाद कोई भी, और मुझे टर्मिनल पर 'यूजर सिग्नल 2' जैसे मुद्रित संदेश मिलता है। मेरे प्रोग्राम में जो कुछ नहीं है , और कार्यक्रम तुरंत क्यों मेरे हैंडलर envoked नहीं किया जा रहा है के रूप में बंद हो जाता है।
किसी भी अंतर्दृष्टि, और कारण है कि मैं मैन्युअल रूप से नहीं भेज सकते अधिक तो एक या दो संकेत बहुत सराहना की जाएगी।
012,351,आपके समय के लिए धन्यवाद।
संपादित करें: ऐसा लगता है जैसे लोग इस पर फंस गए हैं। क्या कोई डीबगिंग युक्तियाँ मैं कोशिश कर सकता हूं?
मैं आपको बता सकता हूं कि यह एक हास्यास्पद अक्षम डिजाइन है, और प्रक्रिया खोजने के लिए 'pidof' का उपयोग सुरक्षित या मजबूत नहीं है। (कल्पना करें कि पासवर्ड चोरी करने के लिए कोई भी एक ही नाम के साथ प्रक्रिया करता है।) आपको इस प्रकार के संचार के लिए यूनिक्स डोमेन सॉकेट का उपयोग करना चाहिए। –
यदि आप पहले पैराग्राफ में नोट करेंगे, तो मैंने उल्लेख किया है कि यह एक असाइनमेंट है और असली दुनिया की समस्या नहीं है। यह अक्षम है, और पिडोफ़ का उपयोग सुरक्षित नहीं है। लेकिन मैं इसके बारे में चिंतित नहीं हूं। – Blackbinary
क्या 'बिट' घोषित 'अस्थिर' है? वैश्विक नामस्थान में –