Mac OS X等效于CreateEvent(),带有用于进程间通信的命名对象



我正在寻找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);

因此,当进程B中的SetEvent调用被执行时,进程A将从WaitForSingleObject中脱离出来并做一些工作。

我实际上不需要发送任何数据,所以我已经排除了命名管道(FIFO)或套接字等有点过头的可能性(我已经考虑过这个类似的问题,但由于它们需要发送数据,我的问题略有不同)。同样,我不知道其他进程的PID(这就是为什么我需要某种共享对象),所以我不能使用任何需要的东西。

到目前为止,我的候选名单是:

  • POSIX信号量-分别使用sem_opensem_waitsem_post创建/打开、等待和发出事件信号。使用起来相当笔直
  • BSD notify(3)函数-使用起来似乎相当简单,即使在使用通知时有点笨拙
  • NSDistributedNotificationCenterCFNotificationCenter函数似乎是最"像Mac"的做事方式,而且相当简单。然而,我的代码可能需要作为dylib运行,根据这个未回答的问题,这可能对我不起作用

那么,有人使用过以上任何一种建议/技巧/恐怖故事吗,或者有我没有想过的更合适的替代方案来实现我想要的吗?

因此,经过进一步的挖掘,我最终决定走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的说法),因此一旦发出信号,就会恢复为无信号。

最新更新