2012-01-16 16 views
6

Estoy buscando la manera más simple o más apropiada en Mac OS X para simplemente "señalar" o notificar un proceso desde otro. Procedente de un fondo de Windows, esto podría lograrse usando algo como lo siguiente.Mac OS X equivalente de CreateEvent() con objeto nombrado para la comunicación entre procesos?

en el Procedimiento A:

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

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

y luego en el Procedimiento B:

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

// signal it 
SetEvent(hOpenedEvent); 

Así que cuando se ejecuta la llamada SetEvent en el Proceso B, Procedimiento A estallaría de WaitForSingleObject y hacer algún trabajo .

No necesito enviar ningún dato, así que he descartado cosas como Canalizaciones con nombre (FIFO) o tomas de corriente, etc. por ser un poco exagerado (he echado un vistazo a this similar question, pero como necesitan para enviar datos, mi pregunta es un poco diferente). Igualmente, no sabré el PID del otro proceso (por lo que necesito algún tipo de objeto compartido), así que no puedo usar nada que lo requiera.

Hasta ahora en mi lista es:

  • POSIX semáforos - usando sem_open, y sem_waitsem_post para crear/abierta, esperar en la señal y el evento respectivamente. Parece bastante sencillo de usar.
  • Las funciones de BSD notify(3) - parece bastante sencillo de usar, si no es un poco torpe para consumir notificaciones.
  • Las funciones NSDistributedNotificationCenter o CFNotificationCenter - parece ser la manera más "similar a Mac" de hacer las cosas y bastante sencilla. Sin embargo, mi código puede necesitar ejecutarse como un dylib y de acuerdo con this unanswered question, eso puede no funcionar para mí.

Entonces, ¿alguien tiene algún consejo/sugerencia/historia de terror que haya utilizado alguna de las opciones anteriores, o incluso las más apropiadas que no he pensado para lograr lo que quiero?

Respuesta

4

Así que después de un poco más de excavación, finalmente, decidí ir por el semáforos ruta POSIX, que parece funcionar para mí, así:

en el Procedimiento A (a la espera en el semáforo):

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

Luego, en el Procedimiento B (señalización del semáforo):

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

el semáforo parece ser también un tipo de "auto reset" (en Windows jerga) por lo vuelve a unsignalled una vez que se tiene b een señalado.