我正在寻找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(这就是为什么我需要某种共享对象)所以我不能使用任何需要它的东西。
到目前为止,我的候选名单是:
sem_open
,sem_wait
和sem_post
创建/打开,等待并分别发出事件信号。看起来相当直接使用。notify(3)
函数 - 使用起来相当简单,如果不是有点笨拙消费通知。NSDistributedNotificationCenter
或CFNotificationCenter
函数 - 似乎是最“Mac喜欢”的做事方式而且相当简单。但是,我的代码可能需要作为dylib运行,并且根据this unanswered question,这可能对我不起作用。那么,有没有人有任何建议/提示/恐怖故事使用上述任何一种,甚至更合适的替代方案,我没想过要达到我想要的目标?
答案 0 :(得分: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术语表示),一旦发出信号,就会恢复为无信号状态。