2012-01-16 70 views
6

我正在尋找最簡單或最恰當的方式在Mac OS X上簡單地「發信號」或通知另一個進程。從Windows背景來看,這可以通過使用類似下面的內容來實現。Mac OS X的等效CreateEvent()與進程間通信的命名對象?

在方法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(這就是爲什麼我需要某種共享對象),所以我不能使用任何需要的東西。

到目前爲止,在我的名單是:

  • POSIX信號燈 - 使用sem_opensem_waitsem_post創建/打開,等待和信號分別事件。顯得相當直接使用。
  • BSD notify(3)函數 - 看起來相當簡單易用,即使不是一點點笨重的使用通知。
  • NSDistributedNotificationCenterCFNotificationCenter函數 - 看起來是最「Mac like」的做事方式,相當簡單。然而,我的代碼可能需要作爲dylib運行,並根據this unanswered question,這可能不適合我。

那麼,有沒有人有任何建議/提示/恐怖故事使用上述任何一種,或甚至更合適的替代品,我沒有想到要實現我想要的?

回答

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的說法),以便恢復到unsignalled一旦它具有b個een發信號。