2012-01-16 7 views
6

मै मैक ओएस एक्स पर बस "सिग्नल" या किसी अन्य प्रक्रिया को सूचित करने के लिए सबसे सरल या सबसे उपयुक्त तरीका ढूंढ रहा हूं। विंडोज पृष्ठभूमि से आ रहा है यह निम्नलिखित की तरह कुछ का उपयोग करके हासिल किया जा सकता है।इंटरप्रोसेस संचार के लिए नामित ऑब्जेक्ट के साथ CreateEvent() के मैक ओएस एक्स समकक्ष?

प्रक्रिया एक में:

// create named event 
hCreatedEvent = CreateEvent(NULL, TRUE, FALSE, "MyUniqueNamedEvent"); 

// wait for it to be signalled 
WaitForSingleObject(hCreatedEvent, INFINITE); 

और उसके बाद प्रक्रिया बी में:

// open the existing named event 
hOpenedEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyUniqueNamedEvent"); 

// signal it 
SetEvent(hOpenedEvent); 

तो जब प्रक्रिया बी में SetEvent कॉल निष्पादित, प्रक्रिया एक बाहर WaitForSingleObject से तोड़ने के लिए और कुछ काम करना होगा ।

मुझे वास्तव में कोई डेटा भेजने की आवश्यकता नहीं है इसलिए मैंने नामित पाइप्स (फीफो) या सॉकेट इत्यादि जैसी चीजों को थोड़ा ओवरकिल के रूप में अस्वीकार कर दिया है (मैंने this similar question पर एक नज़र डाली है, लेकिन जैसा कि उन्हें चाहिए डेटा भेजने के लिए, मेरा प्रश्न थोड़ा अलग है)। समान रूप से, मुझे दूसरी प्रक्रिया के पीआईडी ​​को नहीं पता होगा (यही कारण है कि मुझे किसी प्रकार की साझा वस्तु की आवश्यकता है) इसलिए मैं उस चीज का उपयोग नहीं कर सकता जिसके लिए इसकी आवश्यकता होगी।

तो मेरी शॉर्टलिस्ट पर दूर है:

  • POSIX Semaphores - sem_open, sem_wait और sem_post का उपयोग कर/खुला बनाने के लिए, पर प्रतीक्षा करें और क्रमशः घटना संकेत करने के लिए। उपयोग करने के लिए काफी straighforward दिखता है।
  • बीएसडी notify(3) फ़ंक्शंस - नोटिफिकेशन का उपभोग करने के लिए थोड़ा गुंजाइश नहीं है, तो उपयोग करने के लिए काफी सरल दिखाई देता है।
  • NSDistributedNotificationCenter या CFNotificationCenter फ़ंक्शंस - चीजों को करने और काफी सरल करने के लिए "मैक जैसा" तरीका दिखाई देता है। हालांकि, मेरे कोड को एक डाइलिब के रूप में चलाने की आवश्यकता हो सकती है और this unanswered question के अनुसार, यह मेरे लिए काम नहीं कर सकता है।

तो, क्या किसी के पास उपरोक्त में से किसी भी का उपयोग करने वाली कोई सलाह/टिप्स/डरावनी कहानियां हैं, या यहां तक ​​कि अधिक उपयुक्त विकल्प जिन्हें मैंने नहीं चाहते हैं, हासिल करने के बारे में नहीं सोचा है?

उत्तर

4

तो थोड़ा अधिक खुदाई मैं अंत में POSIX संकेतबाहु मार्ग है, जो इतनी तरह, मेरे लिए काम करने लगता है नीचे जाने का फैसला किया के बाद:

प्रक्रिया एक में (सेमाफोर पर इंतजार कर):

// create semaphore, fail if already exists 
sem_t *sem = sem_open("MyUniqueSemaphore", O_CREAT | O_EXCL, 0666, 0); 
if (sem != SEM_FAILED) 
{ 
    // wait on semaphore 
    if (sem_wait(sem) == 0) 
    { 
     // semaphore signalled! 
    } 

    // close our "handle" to the semaphore and remove it from the system 
    sem_close(sem); 
    sem_unlink("MyUniqueSemaphore"); 
} 

तब प्रक्रिया बी (सेमाफोर संकेत) में:

// open the existing semaphore created in process A 
sem_t *sem = sem_open("MyUniqueSemaphore", 0); 
if (sem != SEM_FAILED) 
{ 
    // "signal" it 
    sem_post(sem); 

    // close our "handle" to the semaphore 
    sem_close(sem); 
} 

सेमाफोर भी एक "ऑटो रीसेट" प्रकार (विंडोज़ की भाषा में) एक बार यह ख है होने के लिए इतना unsignalled वापस करने के लिए वापस चला जाता है लगता है ईन संकेत दिया।

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