Mac OS X中与命名对象进行进程间通信的CreateEvent()等效函数是什么?

7
我需要在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)或套接字等过于复杂的事物(我看了一下类似问题this similar question,但由于它们需要发送数据,所以我的问题略有不同)。同样,我不知道另一个进程的PID(这就是为什么我需要某种共享对象),因此我不能使用任何需要PID的东西。
到目前为止,我的候选名单有:
  • POSIX信号量 - 使用sem_opensem_waitsem_post分别创建/打开、等待和发出事件。似乎相当简单易用。
  • BSD notify(3)函数 - 看起来很容易使用,如果不是有点笨重的消费通知。
  • NSDistributedNotificationCenterCFNotificationCenter函数 - 看起来是最“Mac风格”的方法,也很简单。然而,我的代码可能需要作为dylib运行,根据this unanswered question,这对我可能行不通。

那么,有没有人有任何使用上述任何一种方式的建议/提示/恐怖故事,或者更合适的替代方案,我还没有考虑到,以实现我想要的功能?

1个回答

4

在做了一些更深入的探索后,我最终决定采用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 中称为),因此一旦被标记,它就会恢复为未标记状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接