[英]Mac OS X equivalent of CreateEvent() with named object for interprocess communication?
我正在尋找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(這就是為什么我需要某種共享對象)所以我不能使用任何需要它的東西。
到目前為止,我的候選名單是:
sem_open
, sem_wait
和sem_post
創建/打開,等待並分別發出事件信號。 看起來相當直接使用。 notify(3)
函數 - 使用起來相當簡單,如果不是有點笨拙消費通知。 NSDistributedNotificationCenter
或CFNotificationCenter
功能 - 似乎是最“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術語),一旦發出信號,就會恢復為無信號狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.