簡體   English   中英

Mac OS X相當於CreateEvent()與命名對象進行進程間通信?

[英]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(這就是為什么我需要某種共享對象)所以我不能使用任何需要它的東西。

到目前為止,我的候選名單是:

  • 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術語),一旦發出信號,就會恢復為無信號狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM