2012-01-16 14 views
6

Sto cercando il modo più semplice o più appropriato su Mac OS X per semplicemente "segnalare" o notificare un processo da un altro. Venendo da uno sfondo di Windows questo potrebbe essere ottenuto utilizzando qualcosa come il seguente.Equivalente Mac OS X di CreateEvent() con oggetto denominato per la comunicazione tra processi?

In processo A:

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

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

e poi nel processo B:

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

// signal it 
SetEvent(hOpenedEvent); 

Così, quando viene eseguita la chiamata SetEvent in Process B, processo A potrebbe uscire dal WaitForSingleObject e fare un po 'di lavoro .

Non ho bisogno di inviare effettivamente dati, quindi ho escluso cose come Named Pipes (FIFO) o prese ecc. Come un po 'eccessivo (ho dato un'occhiata a this similar question, ma di cui hanno bisogno per inviare dati, la mia domanda è leggermente diversa). Allo stesso modo, non conoscerò il PID dell'altro processo (che è il motivo per cui ho bisogno di una specie di oggetto condiviso), quindi non posso usare nulla che lo richieda.

Finora sulla mia lista è:

  • POSIX semafori - utilizzando sem_open, sem_wait e sem_post per creare/aperto, aspettare e segnalare l'evento, rispettivamente. Sembra abbastanza semplice da usare.
  • Le funzioni BSD notify(3) - appaiono abbastanza semplici da usare, se non un po 'goffe da consumare notifiche.
  • Le funzioni NSDistributedNotificationCenter o- appare il modo più "Mac like" di fare le cose e abbastanza semplice. Tuttavia, il mio codice potrebbe dover essere eseguito come dylib e in base a this unanswered question, potrebbe non funzionare per me.

Quindi, qualcuno ha qualche consiglio/suggerimento/racconto dell'orrore che ha utilizzato uno dei precedenti, o alternative ancora più appropriate a cui non ho pensato di ottenere quello che voglio?

risposta

4

Così dopo un po 'di più a scavare alla fine ho deciso di andare in fondo alla semafori percorso POSIX, che sembra funzionare per me, in questo modo:

In Process A (in attesa sul semaforo):

// 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"); 
} 

Poi, nel processo B (segnalamento il semaforo):

// 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); 
} 

il semaforo sembra essere anche un tipo di "Auto Reset" (in Windows gergo) in modo ritorna al unsignalled una volta che ha b een segnalato.