2009-03-12 5 views
6

मैं संदेश कतार का उपयोग 2 प्रोग्रामों के बीच एक आईपीसी के रूप में कर रहा हूं। अब मैं संदेश कतार का उपयोग करके एक प्रोग्राम से दूसरे प्रोग्राम में डेटा भेजना चाहता हूं और उसके बाद इसे सिग्नल सिग्नल के माध्यम से अंतरंग करना चाहता हूं।एक प्रोग्राम से दूसरे प्रोग्राम में सिग्नल कैसे भेजना है?

मुझे नहीं पता कि एक प्रोग्राम से दूसरे प्रोग्राम में सिग्नल कैसे भेजा जाए। यदि कोई समाधान हो तो कोई भी नमूना कोड प्रदान कर सकता है।

उत्तर

5

लिनक्स में सिग्नल हत्या प्रणाली कॉल का उपयोग करके भेज दिया जा सकता है बस हत्या 0 कॉल और उदाहरण के दस्तावेज के लिए यह link देखें। आप मनुष्य -2 को भी मार सकते हैं। और यह SIGINT उपयोग SIGUSR1 या SIGUSR2

+0

मैं जोड़ना चाहता हूं: इनका उपयोग करने की सलाह नहीं दी जाती है, क्योंकि वे मानक सिग्नल हैं। रीयलटाइम सिग्नल का उपयोग करना बेहतर है, जो सिगट्रिम से शुरू होता है। उनके पास कुछ महत्वपूर्ण फायदे हैं। – Tebe

11
#include <sys/types.h> 
#include <signal.h> 
int kill(pid_t pid, int sig); 
+0

इस कार्यक्रम में अन्य प्रक्रियाओं के ढक्कन को कैसे प्राप्त करें। – Chaithra

+1

ऐसा करने के कई तरीके हैं। यदि कोई दूसरे के माता-पिता हैं, तो माता-पिता को बच्चे की पिड मिलती है जब यह फोर्क() कहती है, और बच्चा माता-पिता को getppid() के साथ प्राप्त कर सकता है। यदि यह मामला नहीं है, तो आप एक सहमत स्थान पर पिड डाल सकते हैं। उदाहरण के लिए, एक फ़ाइल जो दूसरे के लिए लिखती है। –

+0

हां। ठीक। लेकिन अगर यह कुछ अन्य कार्यक्रम है ..? तो उस प्रोग्राम को प्रोसेसिड कैसे भेजें .. क्या हम सॉकेट का उपयोग कर भेज सकते हैं? – Chaithra

-4
system("kill -2 `pidof <app_name_here>` "); 
+1

यह एक प्रक्रिया से दूसरे में सिग्नल भेजने के लिए एक * बहुत * गन्दा तरीका है। हत्या() या sigqueue() सिस्टम कॉल का उपयोग करने के बारे में कैसे? – slacy

1

नोट का उपयोग करने कि sigqueue() सिस्टम कॉल का उपयोग करके, आप अपने संकेत के साथ डेटा की एक अतिरिक्त टुकड़ा पारित कर सकते हैं उचित नहीं है। यहाँ से "आदमी 2 sigqueue" एक संक्षिप्त उद्धरण है:

मान तर्क डेटा की एक साथ आइटम निर्दिष्ट करने के लिए प्रयोग किया जाता है (या तो एक पूर्णांक या एक सूचक मान) संकेत के साथ भेजा है, और

 union sigval { 
     int sival_int; 
     void *sival_ptr; 
    }; 

2 प्रक्रियाओं के बीच जानकारी का एक छोटा सा सा पारित करने के लिए एक बहुत ही सुविधाजनक तरीका है: निम्न प्रकार है। मैं उपर्युक्त उपयोगकर्ता से सहमत हूं - SIGUSR1 या SIGUSR2 और एक अच्छा सिगवाल का उपयोग करें, और आप जो भी चाहें पारित कर सकते हैं।

आप sival_ptr के माध्यम से साझा स्मृति में कुछ ऑब्जेक्ट को पॉइंटर भी पास कर सकते हैं, और इस तरह एक बड़ी वस्तु को पास कर सकते हैं।