Mac OS X эквивалент CreateEvent () с именованным объектом для межпроцессного взаимодействия? - PullRequest
7 голосов
/ 17 января 2012

Я ищу самый простой или наиболее подходящий способ для Mac OS X, чтобы просто «сигнализировать» или уведомлять один процесс от другого. Исходя из фона Windows, это может быть достигнуто с помощью чего-то вроде следующего.

В процессе A:

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

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

и затем в процессе B:

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

// signal it
SetEvent(hOpenedEvent);

Таким образом, при выполнении вызова SetEvent в процессе B процесс A выйдет из WaitForSingleObject и выполнит некоторую работу.

Мне на самом деле не нужно отправлять какие-либо данные, поэтому я исключил такие вещи, как именованные каналы (FIFO) или сокеты и т. Д., Поскольку это немного излишне (я посмотрел на этот похожий вопрос , но так как им нужно отправить данные, у меня вопрос немного другой). Точно так же я не буду знать PID другого процесса (вот почему мне нужен какой-то общий объект), поэтому я не могу использовать ничего, что потребовало бы этого.

Пока в моем списке:

  • Семафоры POSIX - использование sem_open, sem_wait и sem_post для создания / открытия, ожидания и передачи события соответственно. Кажется довольно простым в использовании.
  • Функции BSD notify(3) - кажется довольно простым в использовании, если не немного неуклюжим для использования уведомлений.
  • Функции NSDistributedNotificationCenter или CFNotificationCenter - кажутся наиболее «похожими на Mac» способами и довольно простыми. Однако мой код может работать как dylib, и в соответствии с этот вопрос без ответа может не сработать.

Итак, есть ли у кого-нибудь какие-либо советы / советы / ужасные истории, использовавшие какой-либо из вышеперечисленных, или даже более подходящих альтернатив, о которых я не думал, чтобы достичь того, чего я хочу? *

1 Ответ

4 голосов
/ 02 февраля 2012

Итак, после еще нескольких копаний, я, наконец, решил пойти по маршруту семафоров POSIX, который, кажется, работает для меня, вот так:

В процессе A (ожидание семафора):

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

Затем в процессе B (сигнализирующем семафор):

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

Семафор, по-видимому, также является типом «автоматического сброса» (на языке Windows), поэтому он возвращается к неподписанному, как только он былзнак.

...